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 关系。一名医生只能拥有一个主专科,也可以选择其他专科作为副专科。稍后在视图中,我可以设置一个算法,在输入其他专业时从专业列表中删除主要专业,以防存在现有的主要专业。
我有一个 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 关系。一名医生只能拥有一个主专科,也可以选择其他专科作为副专科。稍后在视图中,我可以设置一个算法,在输入其他专业时从专业列表中删除主要专业,以防存在现有的主要专业。