2010-08-20 11 views
6

मैं एक मॉडल है कि आप देखेंगे कि key के लिए डिफ़ॉल्ट मान एक यादृच्छिक 16-वर्ण स्ट्रिंग है इसमॉडल फ़ील्ड के लिए यादृच्छिक/गैर-निरंतर डिफ़ॉल्ट मान?

class SecretKey(Model): 
    user = ForeignKey('User', related_name='secret_keys') 
    created = DateTimeField(auto_now_add=True) 
    updated = DateTimeField(auto_now=True) 
    key = CharField(max_length=16, default=randstr(length=16)) 
    purpose = PositiveIntegerField(choices=SecretKeyPurposes) 
    expiry_date = DateTimeField(default=datetime.datetime.now()+datetime.timedelta(days=7), null=True, blank=True) 

तरह दिखता है मिल गया है। समस्या यह है कि, मुझे लगता है कि यह मान कैश हो रहा है और लगातार कई बार इस्तेमाल किया जा रहा है। क्या कोई तरीका है कि मैं हर बार एक अलग स्ट्रिंग प्राप्त कर सकता हूं? (मुझे विशिष्टता/टकराव की परवाह नहीं है)

+1

आपको डैनियल का जवाब 'expiry_date' पर भी लागू करना चाहिए। आपको वर्तमान कोड के साथ वांछित परिणाम नहीं मिलेगा। –

+0

@ [iquadrat: हाँ ... मैंने यह भी देखा। धन्यवाद। – mpen

उत्तर

10

हां, डिफ़ॉल्ट केवल तभी सेट किया जाएगा जब मॉडल मेटाक्लास प्रारंभ होता है, न कि जब आप SecretKey का एक नया उदाहरण बनाते हैं।

एक समाधान डिफ़ॉल्ट मान को callable बनाने का है, इस मामले में प्रत्येक बार एक नया उदाहरण बनाया जाने पर फ़ंक्शन को कॉल किया जाएगा।

def my_random_key(): 
    return randstr(16) 

class SecretKey(Model): 
    key = CharField(max_length=16, default=my_random_key) 

आप, ज़ाहिर है, भी मॉडल की __init__ समारोह में मान सेट सकता है, लेकिन callables क्लीनर हैं और अभी भी model = SecretKey(key='blah') जैसे मानक वाक्य रचना के साथ काम करेंगे।

+2

मैं इसे 'लैम्ब्डा' थप्पड़ मार सकता हूं: इसके सामने इसे कॉल करने योग्य बनाने के लिए, क्या मैं नहीं कर सकता था? – mpen

+0

हाँ, मैंने सोचा कि मैंने पोस्ट करने के बाद :) –

+0

बीटीडब्ल्यू, मुझे डिफ़ॉल्ट मान के रूप में 'एफ()' उदाहरणों का उपयोग करना अच्छा लगेगा। मुझे आलसी होने से बाहर निकलना चाहिए और http://code.djangoproject.com पर टिकट भरना चाहिए ... किसी दिन – alanjds

संबंधित मुद्दे