В Django только одна строка по умолчанию
У меня есть отношение ManyToMany, которое указывает, что у врача может быть много специальностей, но только одна из них является основной. Я разработал пользовательский класс M2M следующим образом:
class Doctor(models.Model):
account = models.ForeignKey(Account, on_delete=models.CASCADE)
specialty = models.ManyToManyField(Specialty, through='DoctorSpecialty')
.....
class Specialty(models.Model):
title = models.CharField(max_length=45)
.....
class DoctorSpecialty(models.Model):
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)
specialty = models.ForeignKey(Specialty, on_delete=models.CASCADE)
default = models.BooleanField(default=True)
Врач может иметь много специальностей, но только одна из них может быть специальностью по умолчанию. Он или она может иметь много специальностей с полем по умолчанию False, но не может иметь более одной специальности с полем по умолчанию True
Я хотел сделать что-то вроде этого:
class Meta:
constraints = [
models.UniqueConstraint(fields=['doctor', 'specialty', 'default'], name='unique specialty')
]
Но это будет означать, что врач может иметь только одну специальность по умолчанию, и только одну другую - не по умолчанию.
Как мы можем достичь этого с минимальным количеством кода?
PS: Я мог бы оставить его без ограничений и попытаться подтвердить добавление новых записей, проверяя, существует ли другая специальность по умолчанию, но это добавит много накладных расходов и исключений.
Я думаю, что нет никакого способа достичь этого с помощью встроенных функций. Поэтому я пришел к такому решению (поскольку никто больше не ответил):
Я создал еще один ForeignKey для первичной специальности, отказался от пользовательского M2M-класса DoctorSpecialty и оставил M2M-отношение со специальностью. Один врач может иметь только одну первичную специальность, а также может выбирать дополнительные специальности в качестве вторичных. Позже в представлениях я могу внедрить алгоритм удаления первичной специальности из списка специальностей при вводе дополнительных специальностей в случае наличия существующей первичной специальности.