2013-03-15 11 views
10

मान लीजिए कि आप एक साधारण मॉडल करते हैं:Django मॉडल: ईमेल क्षेत्र अद्वितीय यदि नल नहीं/खाली

Class Contact(models.Model): 
    email = models.EmailField(max_length=70,blank=True) 
    first = models.CharField(max_length=25,blank=True) 
    last = models.CharField(max_length=25,blank=True) 

मैं ईमेल सेट किया गया है करने के लिए अद्वितीय होना, फिर भी, मैं जरूरी ऐसा करने बनाने में चाहते हैं क्या ऐसा है कि मैं खाली ईमेल पते को बाहर कर देता हूं - और मुझे वह नहीं चाहिए।

मैं इस तरह के बारे में सोच रहा था लेकिन मुझे आश्चर्य है कि इससे निपटने का एक बेहतर तरीका है या नहीं।

from django.core.validators import email_re 
from django.core.exceptions import ValidationError 

def save(self, *args, **kwargs): 
    # ... other things not important here 
    self.email = self.email.lower().strip() # Hopefully reduces junk to "" 
    if self.email != "": # If it's not blank 
     if not email_re.match(self.email) # If it's not an email address 
      raise ValidationError(u'%s is not an email address, dummy!' % self.email) 
     if Contact.objects.filter(email = self.email) # If it already exists 
      raise ValidationError(u'%s already exists in database, jerk' % self.email) 
    super(Contact, self).save(*args, **kwargs) 

क्या ऐसा करने का कोई बेहतर तरीका है?

class Contact(models.Model): 
    email = models.EmailField(max_length=70, null=True, blank=True, unique=True) 
+1

आप की स्थापना' अशक्त = TRUE', और 'अद्वितीय = TRUE'? क्या बात है की कोशिश की है एक ही समय में 'शून्य' और 'अद्वितीय' का उपयोग करने के साथ? – CppLearner

+0

मेरे जीवन के लिए मैं यह नहीं समझ सकता कि मैंने कहां पढ़ा है कि रिक्त करना सही नहीं था = सही और अद्वितीय = एक charfield पर सही। –

+0

lol I मान लीजिए कि आपने पहले से ही कोशिश की है :) किसी को देखने के लिए अच्छा है मुझे किसी को आकर्षित करता है। – CppLearner

उत्तर

18

दुर्भाग्य से, यह सिर्फ अशक्त = सच, अद्वितीय = सच, खाली = सच की स्थापना के रूप में सरल नहीं है:

+3

ग्रेट, ब्रैंडन! लेकिन मुझे लगता है कि यह सहेजने की विधि से सत्यापन बेहतर है, जैसे: 'def clean (self): अगर self.email और email_re.match (self.email) नहीं: सत्यापन बढ़ाएं (u '% s है ईमेल पता नहीं, डमी! '% self.email) ' और आप अपनी बचत विधि में कम कोड लिख सकते हैं। –

6

बस यह करते हैं। जब भी आप सीएसवी, या कुछ अन्य पाठ आधारित स्रोत का उपयोग करके आयात करने का प्रयास करते हैं, तो विशिष्टता के उद्देश्य से, डीजेगो का कुछ हिस्सा "" कुछ ऐसा व्यवहार करता है जिसे डुप्लिकेट नहीं किया जाना चाहिए।

def save(self, *args, **kwargs): 
    # ... other things not important here 
    self.email = self.email.lower().strip() # Hopefully reduces junk to "" 
    if self.email != "": # If it's not blank 
     if not email_re.match(self.email) # If it's not an email address 
      raise ValidationError(u'%s is not an email address, dummy!' % self.email) 
    if self.email == "": 
     self.email = None 
    super(Contact, self).save(*args, **kwargs) 

फिर, के रूप में इरादा अद्वितीय, अशक्त और खाली काम करेंगे का उपयोग कर:

काम के आसपास, विधि बचाने अधिलेखित करने के लिए, इस प्रकार है।

Class Contact(models.Model): 
    email = models.EmailField(max_length=70,blank=True, null= True, unique= True) 
+0

मेरा मानना ​​है कि वास्तव में फॉर्म रेंडरिंग के लिए खाली है, जो कि व्यवस्थापक में सबसे अधिक संभावना होती है (जब तक कि हम फ्रंट एंड पर मॉडल के आधार पर कोई फॉर्म प्रस्तुत नहीं करते - या कुछ तृतीय पक्ष) सही? 'खाली = सही' सेटिंग के बाद से हम कह रहे हैं कि यह फ़ील्ड वैकल्पिक है। बस पुन: पुष्टि करना चाहते हैं। – CppLearner

+0

आप सही हैं, लेकिन 'शून्य = सही' 'NUL को अनुमति दें डेटाबेस पर एल'। –

+0

हाँ :) धन्यवाद! – CppLearner

7

मैं बचाने का उपयोग करने की कोशिश की लेकिन है कि अभी भी क्योंकि त्रुटियों को पहले से ही साफ विधि में उठाए गए हैं काम नहीं किया है, इसलिए मैं अधिलेखित कर दिया है कि बजाय अपने मॉडल के लिए, यह इस तरह दिखता है:

Class MyModel(models.Model): 
    email = models.EmailField(max_length=70,blank=True) 
    first = models.CharField(max_length=25,blank=True) 
    last = models.CharField(max_length=25,blank=True) 
    phase_id = models.CharField('The Phase', max_length=255, null=True, blank=True, unique=True) 

    ... 

    def clean(self): 
     """ 
     Clean up blank fields to null 
     """ 
     if self.phase_id == "": 
      self.phase_id = None 

यह मेरे लिए बहुत अच्छा काम करता है, और बचत का उपयोग करने का उत्तर कुछ मामलों के लिए काम कर सकता है, यह यहां बेस क्लास में शेष सत्यापन के पहले किसी भी को रीसेट करके काम नहीं करना चाहिए। चीयर्स :)

+0

आखिरकार यह मेरे लिए काम करता था और मैं django 1.9 और पायथन 3.5 का उपयोग कर रहा हूं। आपका बहुत बहुत धन्यवाद – Amir

0

चारफ़िल्ल्ड को शून्य करने दें और इसे डिफ़ॉल्ट रूप से डिफ़ॉल्ट करें। जब तक आप एक से अधिक खाली क्षेत्र की जरूरत नहीं है के रूप में ("" "), कोई अखंडता त्रुटि बढ़ा दी जाएगी।

#models.py 
Class Contact(models.Model): 
    email = models.EmailField(max_length=70, blank=True, null=True, unique=True, default=None) 
# protect the db from saving any blank fields (from admin or your app form) 
def save(self, *args, **kwargs): 
    if self.email is not None and self.email.strip() == "": 
     self.email = None 
    models.Model.save(self, *args, **kwargs) 
संबंधित मुद्दे