Python 如何使字段与引用同一外键的其他模型唯一
有没有办法使模型字段与引用同一外键的其他模型唯一 在我的例子中,我试图使具有相同Obj的属性模型的名称是唯一的。例如:如果存在name='Types'和obj=1的字符属性,则不能存在name='Types'和obj=1的其他字符属性,也不能存在name='Types'和obj=1的IntAttribute 我目前对解决方案的想法如下: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)
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('...')