Análise e Otimização da Estrutura de Tabelas de Cursos

Campos de ForeignKey

# Parâmetros:
related_name = "nome_para_relacao_inversa"  # Substitui 'modelname_set'
related_query_name = "prefixo_consulta"     # Define prefixo para buscas reversas

Modelaegm de Dados para Cursos

class ModeloBaseCurso(models.Model):
    titulo = models.CharField(max_length=64)
    descricao = models.TextField()
    participantes = models.IntegerField(default=0)
    nivel = models.IntegerField(choices=[(0, 'Iniciante'), (1, 'Intermediário')])
    carga_horaria = models.IntegerField()
    categoria = models.IntegerField(choices=[(0, 'Desenvolvimento'), (1, 'Infraestrutura')])
    visivel = models.BooleanField(default=True)

    class Meta:
        abstract = True

class CursoGratuito(ModeloBaseCurso):
    capa = models.ImageField(upload_to='cursos/gratuitos')
    recursos = models.FileField(upload_to='anexos')

class CursoPratico(ModeloBaseCurso):
    imagem = models.ImageField(upload_to='cursos/praticos')
    preco_venda = models.DecimalField(max_digits=8, decimal_places=2)
    custo_producao = models.DecimalField(max_digits=8, decimal_places=2)

class CursoRapido(ModeloBaseCurso):
    miniatura = models.ImageField(upload_to='cursos/rapidos')
    valor = models.DecimalField(max_digits=8, decimal_places=2)
    duracao_estimada = models.IntegerField(verbose_name='Período sugerido (semanas)')

Impelmentação de Sistema de Cursos

Passo 1: Criação da Aplicação

cd projeto/apps
python ../../manage.py startapp cursos

Passo 2: Definição dos Modelos

class AreaConhecimento(models.Model):
    nome = models.CharField(max_length=64, unique=True)

class Instrutor(models.Model):
    nome = models.CharField(max_length=64)
    especialidade = models.CharField(max_length=128)
    bio = models.TextField()

class Disciplina(models.Model):
    TIPOS = [(0, 'Pago'), (1, 'Premium'), (2, 'Certificação')]
    NIVEL = [(0, 'Básico'), (1, 'Intermediário'), (2, 'Avançado')]
    
    titulo = models.CharField(max_length=128)
    capa = models.ImageField(upload_to='disciplinas')
    tipo = models.SmallIntegerField(choices=TIPOS)
    resumo = models.TextField()
    dificuldade = models.SmallIntegerField(choices=NIVEL)
    carga_horaria = models.IntegerField()
    preco = models.DecimalField(max_digits=7, decimal_places=2)
    area = models.ForeignKey(AreaConhecimento, on_delete=models.SET_NULL, null=True)
    professor = models.ForeignKey(Instrutor, on_delete=models.SET_NULL, null=True)

class Modulo(models.Model):
    disciplina = models.ForeignKey(Disciplina, related_name='modulos', on_delete=models.CASCADE)
    ordem = models.PositiveSmallIntegerField()
    titulo = models.CharField(max_length=128)
    objetivos = models.TextField()

class Aula(models.Model):
    FORMATOS = [(0, 'Material'), (1, 'Exercício'), (2, 'Vídeo')]
    
    modulo = models.ForeignKey(Modulo, related_name='aulas', on_delete=models.CASCADE)
    titulo = models.CharField(max_length=128)
    sequencia = models.PositiveSmallIntegerField()
    formato = models.SmallIntegerField(choices=FORMATOS, default=2)
    conteudo = models.CharField(max_length=255)

Passo 3: Registro de Modelos no Admin

from django.contrib import admin
from .models import *

admin.site.register(AreaConhecimento)
admin.site.register(Disciplina)
admin.site.register(Instrutor)
admin.site.register(Modulo)
admin.site.register(Aula)

Passo 4: Migrações de Banco de Daddos

python manage.py makemigrations
python manage.py migrate

Passo 5: População de Dados

-- Exemplo de inserção de instrutor
INSERT INTO cursos_instrutor 
(nome, especialidade, bio) 
VALUES ('Ana Silva', 'Desenvolvimento Python', 'Instrutora com 10 anos de experiência');

-- Exemplo de inserção de disciplina
INSERT INTO cursos_disciplina 
(titulo, tipo, dificuldade, preco, area_id, professor_id) 
VALUES ('Python para Data Science', 1, 2, 299.90, 1, 1);

Tags: Django ORM Modelos postgresql EstruturaDados

Publicado em 6-22 01:07