Python 如何检查Django中的特定约束?
我有下面的型号Python 如何检查Django中的特定约束?,python,django,django-models,Python,Django,Django Models,我有下面的型号 class BusCompanyStaff(BaseModel): user = models.OneToOneField( BusCompanyUser, on_delete=models.CASCADE ) position = models.ForeignKey( StaffPosition, on_delete=models.SET_NULL, null=True,
class BusCompanyStaff(BaseModel):
user = models.OneToOneField(
BusCompanyUser,
on_delete=models.CASCADE
)
position = models.ForeignKey(
StaffPosition,
on_delete=models.SET_NULL,
null=True,
related_name='position'
)
created_by = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='created_by'
)
staff_of = models.ForeignKey(
BusCompany,
on_delete=models.CASCADE
)
我的员工职位模型是
class StaffPosition(BaseModel):
name = TitleCharField(
max_length=20,
validators=[validate_staff_position],
unique=True)
class Meta:
default_permissions = ()
verbose_name = 'Staff Position'
verbose_name_plural = 'Staff Positions'
def __str__(self):
return self.name
问题是,一家公交公司只能有一个员工职位“所有者”,并允许许多其他员工职位,即“经理、出纳员”,但所有者职位对于特定的公交公司是唯一的。
我想使用UniqueConstraints和UniqueConstraints一起使用,但发现UniqueConstraints条件无法索引,即它受到了限制
我用干净的方法试过了
def clean(self):
if len(BusCompanyStaff.objects.filter(
position__name='Owner')) > 1:
raise DjangoValidationError(
{'position': _('Cannot Assign two owners.')}
)
但是上面的方法选中了所有公交公司的“所有者”,我不知道如何使所有者对于特定的公交公司是唯一的。您可以在clean by super()on clean()方法中访问表单的其他字段:
def clean(self):
if len(BusCompanyStaff.objects.filter(
position__name='Owner',
staff_of=self.staff_of)) > 0:
raise DjangoValidationError(
{'position': _('Cannot Assign two owners.')}
)
def clean(self):
cleaned_data = super().clean()
bus_company_id = cleaned_data.get('staff_of')
# check more than 1 owner per BusCompany
if len(BusCompanyStaff.objects.filter(position__name='Owner', staff_of__id=int(bus_company_id)) > 1:
self.add_error('position','Cannot Assign two owners.')
return cleaned_data
从django文档中,您可以创建自己的模型约束,并通过约束的名称进行验证。我的意思是,如何仅验证所有者的唯一性,而不验证其他员工职位的唯一性?在保存之前,您将获得BusCompany的实例,对吗?在保存之前,只需检查len(BusCompanyStaff.objects.filter(position\uu name='Owner',staff\u of=BusCompany\u instance))>1是否已获取,但如何获取模型中的“BusCompany\u实例”?i、 e在clean Method中这不是100%工作,但在添加时不会抛出错误。我已编辑了您的ans感谢您提供的ans并从您的角度验证ans