2009-11-30 14 views
25

जोड़ने से पहले कोई ऑब्जेक्ट पहले से मौजूद है या नहीं, यह एक बहुत ही सरल Django प्रश्न है, लेकिन मुझे शिकार के बावजूद Django दस्तावेज़ों में इसका जवाब नहीं मिल रहा है!Django: जांचें कि

मैं कैसे जांचूं कि कोई ऑब्जेक्ट पहले से मौजूद है या नहीं, और केवल पहले से मौजूद है तो इसे जोड़ें?

यहां कोड है - मैं डेटाबेस में दो बार follow_role जोड़ना नहीं चाहता अगर यह पहले से मौजूद है। मैं पहले कैसे जांच करूं? प्राप्त करें() हो सकता है - लेकिन फिर Django शिकायत करेगा अगर() कुछ भी वापस नहीं करता है?

current_user = request.user 
follow_role = UserToUserRole(from_user=current_user, to_user=user, role='follow') 
follow_role.save() 

धन्यवाद!

role, created = UserToUserRole.objects.get_or_create(
    from_user=current_user, to_user=user, role='follow') 

यह (मॉडल, bool) के एक टपल जहां 'मॉडल' वस्तु में आपकी रुचि है और है रिटर्न:

उत्तर

36

इस मुहावरा अपने मॉडल प्रबंधक पर 'get_or_create' कहा जाता है के लिए एक सहायक समारोह नहीं है 'बूल' आपको बताता है कि इसे बनाया जाना चाहिए या नहीं।

+1

शानदार। समस्या हल करता है। धन्यवाद! क्या कोई ऑब्जेक्ट मौजूद है या नहीं, यह जांचने के लिए कोई ठोस कार्य है, और यदि ऐसा नहीं है तो कुछ भी नहीं करें? – AP257

+2

मुझे अपने सिर के ऊपर से एक सहायक फ़ंक्शन के बारे में पता नहीं है, लेकिन मुझे लगता है कि आप UserToUserRole.objects.filter (...) कर सकते हैं। हटाएं()। यह आपको यह जांचने का एक तरीका नहीं देगा कि वस्तु वास्तव में मौजूद है या नहीं। आपको हटाने से पहले अपने क्वेरी सेट पर गिनती() की जांच करनी होगी। बेशक, आप \ _or \ _create स्रोत प्राप्त करने पर एक झलक ले सकते हैं और अपना स्वयं का सहायक कार्य पर्याप्त आसान बना सकते हैं। –

+0

ठीक है। बहुत स्पष्ट उत्तर के लिए फिर से धन्यवाद! – AP257

4

यदि आप Django के हालिया संस्करण का उपयोग कर रहे हैं, तो आप UserToUserRole मॉडल के unique_together विकल्प का उपयोग कर सकते हैं, और फिर get_or_create() विधि जो होलोवे का उपयोग करते हैं। यह गारंटी देगा कि आपको डुप्लिकेट नहीं मिल सकता है।

0

आप चेक बचाने आप संकेत जाँच करने के लिए बचाने पूर्व इस्तेमाल कर सकते हैं हर बार किया पहले, http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save

मॉडल में वैकल्पिक रूप से आप अद्वितीय = संपत्ति है कि निर्धारित करता है कि एक आइटम एक ही है के लिए सच है निर्दिष्ट कर सकते हैं चाहते हैं आइटम, यदि आप एक ही चीज़ को फिर से सहेजने का प्रयास करते हैं, तो यह एक अपवाद (django.db.IntegrityError) फेंक दिया जाएगा।

आप एक से अधिक क्षेत्र को एक साथ करता है कि कुछ अद्वितीय आप मेटा भीतरी कक्षा में unique_together का उपयोग करना होगा है, तो http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

0

आप (प्राप्त) का उपयोग कर सकते हैं, लेकिन आप कोशिश के साथ लपेट करना होगा इस तरह -except:

try: 
    obj = UserToUserRole.objects.get(from_user=current_user, to_user=user, role='follow') 
except UserToUserRole.DoesNotExist: 
    # here write a code to create a new object 
संबंधित मुद्दे