2017-09-11 35 views
1

考慮以下模型:跳過在Django form.is_valid()一個或多個約束

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()將跳過email領域unique約束。

這是必不可少的,那郵件將unique,但是在一個特定view我想用get_or_create,這似乎不工作:

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

這可能嗎?

回答

0

這是不可能的。

unique=True創建一個數據庫約束來檢查字段的唯一性。通過它的設計,它不允許非唯一的值,並且規避這種情況的唯一方法是消除約束。

如果問題是您想允許多個空值,您可以設置null=True。多個NULL值仍被認爲是唯一的約束。

+0

請參閱編輯。 –

+0

@NarūnasK這是一個完全不同的問題,我沒有答案,因爲你沒有包括你的問題的很多細節。 – knbk

+0

我敢說,這個問題仍然是一樣的,我只是增加了潛在的用例:) –

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)