Motivo: Motivo: Um passageiro pode ter várias reservas, e um voo pode ter vários passageiros. A chave composta identifica uma reserva única por voo e passageiro.
🏫 Exemplo 2: Registro de Presença em Aulas
Tabela: Presenca
Chave composta: (aluno_id, data, aula_id)
Motivo: Um aluno só pode ter um registro por aula por dia. Isso evita duplicidade de presença.
Ainda estamos trabalhando no suporte a chaves primárias compostas para campos relacionais, incluindo campos GenericForeignKey, e para o Django Admin. No momento, modelos com chaves primárias compostas não podem ser registrados no Django Admin. Você pode esperar esse recurso em versões futuras.
Observações: O Django não oferece suporte para migração para, ou a partir de, uma chave primária composta após a criação da tabela. Também não é possível adicionar ou remover campos de uma chave primária composta por meio de migrações do Django.
Se você deseja migrar uma tabela existente de uma chave primária única para uma chave primária composta, siga as instruções específicas do seu sistema de banco de dados para realizar essa alteração manualmente.
Depois que a chave primária composta estiver definida no banco de dados, adicione o campo CompositePrimaryKey ao seu modelo. Isso permitirá que o Django reconheça e trate corretamente a chave primária composta.
classDiagram
class Aluno {
+int id
+string nome
}
class Professor {
+int id
+string nome
}
class Turma {
+int id
+string nome
+int ano
}
class Aula {
+int id
+date data
+string horario
+int turma_id
+int professor_id
}
class Presenca {
+int aluno_id
+int aula_id
+date data_presenca
+bool presente
+string observacao
}
Aluno "1" --> "0..*" Presenca : registra
Aula "1" --> "0..*" Presenca : possui
Turma "1" --> "0..*" Aula : contém
Professor "1" --> "0..*" Aula : ministra
Aluno "0..*" --> "1" Turma : pertence
note for Presenca "Chave composta: aluno_id + data_presenca + aula_id"
admin.site.register(Attendance)
django.core.exceptions.ImproperlyConfigured: The model Attendance has a composite primary key, so it cannot be registered with admin.
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ('name', 'class_group', 'color')
widgets = {
'color': forms.ColorInput()
}
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ('name', 'class_group', 'color', 'phone')
widgets = {
...
'phone': forms.TelInput(),
}
class SearchForm(forms.Form):
search = forms.CharField(
required=False,
widget=forms.SearchInput()
)