Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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 如何使字段与引用同一外键的其他模型唯一_Python_Django_Django Models - Fatal编程技术网

Python 如何使字段与引用同一外键的其他模型唯一

Python 如何使字段与引用同一外键的其他模型唯一,python,django,django-models,Python,Django,Django Models,有没有办法使模型字段与引用同一外键的其他模型唯一 在我的例子中,我试图使具有相同Obj的属性模型的名称是唯一的。例如:如果存在name='Types'和obj=1的字符属性,则不能存在name='Types'和obj=1的其他字符属性,也不能存在name='Types'和obj=1的IntAttribute 我目前对解决方案的想法如下: def clean_fields(self, exclude=None): super().clean_fields(exclude=exclude)

有没有办法使模型字段与引用同一外键的其他模型唯一

在我的例子中,我试图使具有相同Obj的属性模型的名称是唯一的。例如:如果存在name='Types'和obj=1的字符属性,则不能存在name='Types'和obj=1的其他字符属性,也不能存在name='Types'和obj=1的IntAttribute

我目前对解决方案的想法如下:

def clean_fields(self, exclude=None):
    super().clean_fields(exclude=exclude)
    for other_name in IntAttribute.objects.filter(obj=self.obj):
        if self.name == other_name:
            raise ValidationError(
                ('Attributes of the same object may not have the same name, %(name) s already exists for '
                 '%(object) s' % {'name': self.name, 'object': self.obj.name})
            )

    for other_name in CharAttribute.objects.filter(obj=self.obj):
        if self.name == other_name:
            raise ValidationError(
                ('Attributes of the same object may not have the same name, %(name) s already exists for '
                 '%(object) s' % {'name': self.name, "object": self.obj.name})
            )
但是为将来可能创建的每个属性创建另一个for循环感觉很重复,必须有更好的方法来完成这项任务

提前感谢您的反馈。

您可以使用以确保模型中没有重复的字段组合:

class CharAttribute (models.Model):
    name = models.CharField(max_length=40)
    obj = models.ForeignKey(Obj, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('name', 'obj')
在模型之间,您必须进行手动验证:

class CharAttribute (models.Model):
    name = models.CharField(max_length=40)
    obj = models.ForeignKey(Obj, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('name', 'obj')

    def clean(self):
        if IntAttribute.objects.filter(name=self.name, obj=self.obj).exists():
            raise ValidationError('...')


同样的方法也适用于另一种型号。

我觉得自己像个有for循环的白痴,谢谢你,哈哈
class CharAttribute (models.Model):
    name = models.CharField(max_length=40)
    obj = models.ForeignKey(Obj, on_delete=models.CASCADE)

    class Meta:
        unique_together = ('name', 'obj')

    def clean(self):
        if IntAttribute.objects.filter(name=self.name, obj=self.obj).exists():
            raise ValidationError('...')