Я сейчас пробую свой первый проект Django и столкнулся с проблемой того, что мое приложение странно реагирует, когда я пытаюсь создать объект с дублированными составными первичными ключами.Следующая стартовая ситуация:
Чтобы иметь возможность четко определить свой результат, я использую составной первичный ключ, состоящий из уникального идентификатора студента (matriculation_number
) и уникального идентификатора экзамена (exam_id
).Вот соответствующая модель в моем файле models.py:
class Result(models.Model):
# No student should be able to be deleted as long as there are still results to show.
matriculation_number = models.ForeignKey(Student, on_delete=models.PROTECT, verbose_name='Matrikelnummer')
# No student should be able to be deleted as long as there are still results to show.
exam_id = models.ForeignKey(Exam, on_delete=models.PROTECT, verbose_name='Prüfungsnummer')
grade = models.DecimalField(max_digits=3, decimal_places=2, default=None,
validators=[MaxValueValidator(6), MinValueValidator(1)],
verbose_name='Note')
# Workaround for composite primary-key
# Get Data using Result.objects.get(matriculation_number=”10”,exam_id=”125”)
class Meta:
unique_together = (('matriculation_number', 'exam_id'),)
verbose_name = 'Ergebnis'
verbose_name_plural = 'Ergebnisse'
Чтобы вообще получить составной первичный ключ, я использую обходной путь с unique_together
.Следующие части views.py и forms.py также принадлежат ему:
views.py
class ResultCreateView(generic.CreateView):
form_class = CreateResultForm
template_name = 'studentmanager/result/result_create_form.html'
success_url = reverse_lazy('studentmanager:result')
forms.py
class CreateResultForm(forms.ModelForm):
class Meta:
model = Result
fields = ['exam_id', 'matriculation_number', 'grade']
widgets = {
'exam_id': forms.Select(choices=Exam.objects.all(), attrs={'class': 'form-control'}),
'matriculation_number': forms.Select(choices=Student.objects.all(), attrs={'class': 'form-control'}),
'grade': forms.NumberInput(attrs={'class': 'form-control'})
}
Если я сейчас создам совершенно новый результат, все работает безупречно.Но если я попытаюсь ввести новый балл для того же студента и того же экзамена, запрос POST будет запущен с кодом 200, но я не буду перенаправлен на мой success_url, и данные также не будут обновлены.Даже ошибка не появляется.Я ожидал бы, что форма покажет мне ошибку, указывающую, что для выбранной комбинации уже существует запись.
Как я могу реализовать такую проверку, которая предотвращает создание дублирующих новых записей для существующих составных ключей, но соответствующуюошибка уже появляется в виде?