Django 只有一个默认行

Django only one default row

我有一个 ManyToMany 关系,表明 Doctor 可以有很多专业,但其中只有一个是主要专业。 我设计了一个自定义 M2M class 如下:

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:我可以让它不受约束,并尝试通过检查是否存在另一个默认专业来验证添加新条目,但这会增加很多开销和引发异常。

我认为我们无法通过 built-in 函数实现此目的。所以我想出了这个解决方案(因为没有其他人回答):

我为 Primary Specialty 创建了另一个 ForeignKey,并放弃了 DoctorSpecialty 自定义 M2M class 并离开了与 Specialty 的 M2M 关系。一名医生只能拥有一个主专科,也可以选择其他专科作为副专科。稍后在视图中,我可以设置一个算法,在输入其他专业时从专业列表中删除主要专业,以防存在现有的主要专业。