Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查Django中的特定约束?_Python_Django_Django Models - Fatal编程技术网

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