Python Django模型检查模型属性中的值是否唯一
我有两种型号:Python Django模型检查模型属性中的值是否唯一,python,django,Python,Django,我有两种型号:Header和trooptype,用于Header中的OneToOneField。我试图实现的是检查标题的名称是否唯一,但不仅在标题的名称字段中,而且在部队类型的名称字段中。这是因为,如果您在部队类型中选择某个值,则名称字段不是必需的,可以说,它应该从部队类型对象继承该名称,以便不通过复制它来复制值。当然,如果您保留部队类型空,则需要标题的名称。你会怎么做 为了澄清我的思路,我附加了我正在试图修改的当前代码——目前我只是复制名称 models.py: class TroopsTyp
Header
和trooptype
,用于Header
中的OneToOneField
。我试图实现的是检查标题
的名称是否唯一,但不仅在标题
的名称字段中,而且在部队类型
的名称字段中。这是因为,如果您在部队类型
中选择某个值,则名称字段不是必需的,可以说,它应该从部队类型
对象继承该名称,以便不通过复制它来复制值。当然,如果您保留部队类型
空
,则需要标题
的名称。你会怎么做
为了澄清我的思路,我附加了我正在试图修改的当前代码——目前我只是复制名称
models.py
:
class TroopsType(models.Model):
name = models.CharField(max_length=32, unique=True)
unit = models.ForeignKey(Unit, on_delete=models.RESTRICT)
def __str__(self):
return self.name
class Header(models.Model):
name = models.CharField(max_length=32, blank=True, unique=True)
troops_type = models.OneToOneField(
TroopsType, on_delete=models.CASCADE, blank=True, null=True
)
data_type = models.ManyToManyField(DataType)
class Meta:
constraints = [
models.CheckConstraint(
check=(~models.Q(name="")),
name="%(app_label)s_%(class)s_required_name",
),
]
def __str__(self):
return self.name
class HeaderAdminForm(forms.ModelForm):
class Meta:
model = Header
fields = "__all__"
def clean(self):
troops_type = self.cleaned_data["troops_type"]
if troops_type:
self.cleaned_data["name"] = troops_type.name
elif not self.cleaned_data["name"]:
raise forms.ValidationError("No name or troops type.")
super().clean()
@admin.register(Header)
class HeaderAdmin(admin.ModelAdmin):
form = HeaderAdminForm
admin.py
:
class TroopsType(models.Model):
name = models.CharField(max_length=32, unique=True)
unit = models.ForeignKey(Unit, on_delete=models.RESTRICT)
def __str__(self):
return self.name
class Header(models.Model):
name = models.CharField(max_length=32, blank=True, unique=True)
troops_type = models.OneToOneField(
TroopsType, on_delete=models.CASCADE, blank=True, null=True
)
data_type = models.ManyToManyField(DataType)
class Meta:
constraints = [
models.CheckConstraint(
check=(~models.Q(name="")),
name="%(app_label)s_%(class)s_required_name",
),
]
def __str__(self):
return self.name
class HeaderAdminForm(forms.ModelForm):
class Meta:
model = Header
fields = "__all__"
def clean(self):
troops_type = self.cleaned_data["troops_type"]
if troops_type:
self.cleaned_data["name"] = troops_type.name
elif not self.cleaned_data["name"]:
raise forms.ValidationError("No name or troops type.")
super().clean()
@admin.register(Header)
class HeaderAdmin(admin.ModelAdmin):
form = HeaderAdminForm
澄清问题:您的意思是,当您使用
部队类型==None
创建一个新的标题时,它应该检查标题.name
,以确保它没有重用部队类型.name
中的名称?是的。我的意思是头.name
不能与任何其他头头.name
和部队类型.name
同时相同。但是,如果没有标题
具有部队类型
和部队类型。名称
而一些未使用的部队类型
对象具有该名称,则可以创建该名称。明白了。您可以重写头模型中的clean
方法,执行super().clean()
,然后执行类似的操作:如果不是self.tours\u type和trooptype.objects.filter(name=self.name).exists():引发ValidationError('name','error text')
Oh,然后我们彼此不理解:D但我明白你的想法,这就是我需要的:如果self.name和Header.objects.filter(forces\u type\u name=self.name).exists():raise ValidationError(“name已经存在(继承自forces type)。”)elif(self.forces\u type和Header.objects.filter(name=self.forces\u type.name).exists()):raise ValidationError(“名称已存在”)
您可以发布答案让我接受。谢谢