2015-03-26 3 views
12

के साथ उपयोग किए जाने पर फ़ील्ड सेट करने में विफल रहता है, जहां मैं संभवतः उपयोगकर्ता दर्ज फ़ील्ड पर डुप्लिकेशंस से बचने के लिए get_or_create के साथ name__iexact का उपयोग करना चाहता हूं।Django get_or_create IExact

मेरे प्रदाता मॉडल का नाम फ़ील्ड है जिसका उपयोग मैं get_or_create में करता हूं।

देखने ठीक काम करता है, लेकिन जब नीचे (नाम

p1/इमारती लकड़ी उदाहरण के रूप में पहली बार के लिए उदाहरण बनाकर विफल:

>>> p1, c1 = Provider.objects.get_or_create(name__iexact="Timber") 
>>> p1, c1 
(<Provider: >, True) 
>>> p1.name 
u'' 

वर्क्स के रूप में यहाँ की उम्मीद:

>>> p2, c2 = Provider.objects.get_or_create(name="Cedar") 
>>> p2.name, c2 
('Cedar', True) 
>>> p3, c3 = Provider.objects.get_or_create(name__iexact="Cedar") 
>>> p3, c3 
(<Provider: Cedar>, False) 
>>> Provider.objects.get_or_create(name__iexact="cedar") 
(<Provider: Cedar>, False) 

__iexactget_or_create के निर्माण हिस्से के साथ असंगत है, क्या यह अपेक्षित व्यवहार (और क्यों) है, या क्या मैं Django बग में चला गया हूं?

उत्तर

13

जो आप देख रहे हैं वह सही व्यवहार है।

get_or_create 'ऑब्जेक्ट मिलान kwargs ऑब्जेक्ट मिलान करने और वापस लौटने के लिए शॉर्टेंड है, यदि यह अस्तित्व में नहीं है, तो इसे defaults' का उपयोग करके बनाएं। आपका लुकअप उस ऑब्जेक्ट की तलाश में है जहां name'cedar' पर केस-असंवेदनशील मिलान है। वह वस्तु मौजूद है, इसलिए यह वापस आ गया है। न कुछ ज्यादा, न कुछ कम।

अब यदि कोई मिलान नहीं था, तो स्टीफन सही है, और आपको पैरामीटर में name निर्दिष्ट करना होगा। लुकअप सेपरेटर __ युक्त सभी लुकअप create() पर दिए गए पैरामीटर से अलग किए गए हैं।

+1

आह। वह अंतिम वाक्य कुंजी है। यहां यह दस्तावेज़ों में है: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#get-or-create 'k के लिए v, v kwargs.items() में अगर '__' में नहीं है k' – owenfi

9

documentation के अनुसार, आप (इस कोड की कोशिश नहीं की है) डिफ़ॉल्ट आर्ग इस्तेमाल करने की कोशिश कर सकते हैं:

p1, c1 = Provider.objects.get_or_create(
    defaults={'name':"Timber"}, 
    name__iexact="Timber" 
) 

यह समझ में आता है, क्योंकि आप तो खोज और ऑब्जेक्ट निर्माण कि अलग हो सकता है।

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