Django 如何检查名字和姓氏是否仅在创建时是唯一的?

Django 如何检查名字和姓氏是否仅在创建时是唯一的?,django,forms,Django,Forms,我有以下型号: class Person(models.Model): short_name = models.CharField(max_length=64) long_name = models.CharField(max_length=64) 我有以下表格: class PersonForm(forms.ModelForm): class Meta: model = Person fields = ['short_name', 'l

我有以下型号:

class Person(models.Model):
    short_name = models.CharField(max_length=64)
    long_name = models.CharField(max_length=64)
我有以下表格:

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = ['short_name', 'long_name']
现在我正在使用此表单进行更新和创建

如果有人试图创建一个短名和长名相同的人,我希望此表单引发ValidationError

但是,如果用户正在修改现有用户的数据,我不想引发异常

我曾考虑编写一个干净的方法来检查
Person.objects.filter(long\u name=X,short\u name=Y).count()
在修改现有实例时是否返回任何内容,但此条件错误失败


你将如何改变这一点

您可以通过一起使用
unique\u
来实现这一点,如模型级别所示

您可以通过一起使用
unique\u
来实现这一点,如模型级别所示

现有实例是具有
pk
值的实例。因此,只需在您的
clean()
方法中检查:

class Person(models.Model):
    short_name = models.CharField(max_length=64)
    long_name = models.CharField(max_length=64)

    def clean(self):
        if self.pk is None and Person.objects.filter(long_name=self.long_name,
                                                     short_name=self.short_name).exists():
            raise ValidationError("Someone already has those names!")

现有实例的值为
pk
。因此,只需在您的
clean()
方法中检查:

class Person(models.Model):
    short_name = models.CharField(max_length=64)
    long_name = models.CharField(max_length=64)

    def clean(self):
        if self.pk is None and Person.objects.filter(long_name=self.long_name,
                                                     short_name=self.short_name).exists():
            raise ValidationError("Someone already has those names!")