在Django form.is_valid()中跳过一个或多个约束

时间:2017-09-11 16:11:38

标签: django python-3.x django-forms

鉴于以下模型:

class User(models.Model):
    role = models.IntegerField(default=0, blank=True)
    name = models.CharField(max_length=255, blank=False, null=False)
    email = models.EmailField(max_length=128, unique=True, blank=False, null=False)

我需要form.is_valid()跳过unique字段上的email约束。

至关重要的是,电子邮件将是unique,但在一个特定的view中,我想使用get_or_create,这似乎不起作用:

if form.is_valid():
    usr, usr_created = models.User.objects.get_or_create(email=form.email)
    <...>

这可能吗?

2 个答案:

答案 0 :(得分:0)

这是不可能的。

unique=True创建一个数据库约束,用于检查字段的唯一性。通过它的设计,这不允许非唯一值,唯一的方法是消除约束。

如果问题是您想要允许多个空值,则可以设置null=True。约束仍然认为多个NULL值是唯一的。

答案 1 :(得分:0)

不要在字段列表中列出要覆盖的字段,并在ModelForm中创建一个新的自定义字段:

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ["role", "name"]

    email = forms.EmailField(max_length=128)

    def save(self, commit=True):
        instance = super(PatientForm, self).save(commit=False)
        instance.email= self.cleaned_data.get("email")
        return instance.save(commit)