2014-09-14 16 views
5

में डिफ़ॉल्ट मान के रूप में UUID मैंने django मॉडल में डिफ़ॉल्ट मान के अजीब व्यवहार को देखा है। उदाहरण के लिए हम एक सरल Django मॉडल है:Django मॉडल

import uuid 
... 

class SiteUser(models.Model): 
    ... 
    username = models.CharField(max_length=255, verbose_name=u"Username") 
    activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", default=uuid.uuid1()) 

जब मैं एक नया उपयोगकर्ता बनाने, और उसके बाद इस तरह एक दूसरे से:

user_a = SiteUser(username="UserA") 
user_a.save() 
user_b = SiteUser(username="UserB") 
user_b.save() 

Django ही activation_key

साथ 2 उपयोगकर्ताओं बनाता है लेकिन फिर मैं इसे ऐसा करता हूं:

user_a = SiteUser(username="UserA") 
user_a.activation_key = uuid.uuid1() 
user_a.save() 
user_b = SiteUser(username="UserB") 
user_b.activation_key = uuid.uuid1() 
user_b.save() 

सब कुछ ठीक काम करता है डी Django विभिन्न सक्रियण कुंजी के साथ 2 उपयोगकर्ताओं बनाता है।

यहां क्या हो रहा है? पाइथन मॉडल ऑब्जेक्ट लोड करता है और जब wsgi ऐप शुरू होता है या मॉडल के डिफ़ॉल्ट मान की गणना करता है? यूयूआईडी पहले मामले में समान मूल्य क्यों देता है लेकिन दूसरे में अलग है?

धन्यवाद।

+1

@Rohan का उल्लेख है, यह एक प्रतिदेय की जरूरत है। यहां प्रासंगिक दस्तावेज https://docs.djangoproject.com/en/dev/ref/models/fields/#default है – karthikr

उत्तर

16

समस्या default विशेषता है कि आप के रूप में

activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", 
       default=uuid.uuid1()) 

यहाँ आप uuid.uuid1() कॉल द्वारा लौटाए गए के रूप में एक प्रतिदेय लेकिन मूल्य नहीं डिफ़ॉल्ट मान सेट कर रहे हैं जब इस मॉडल वर्ग आरंभ नहीं हो जाता की स्थापना कर रहे हैं।

आपको इसे default=uuid.uuid1 के रूप में सेट करना चाहिए जो इसे कॉल करने योग्य के रूप में सेट करता है, और प्रत्येक बार नए डिफ़ॉल्ट मान को उपयोग करने के लिए नया यूयूआईडी सेट करता है।