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(“名称已存在”)
您可以发布答案让我接受。谢谢