2012-11-28 11 views
7

मान लीजिए मैं इस मॉडल है:Django get_or_create, कैसे प्रतिबद्ध कहना = झूठी

class SocialGroupMembers(models.Model): 
    social_group = models.ForeignKey(SocialGroup, related_name="members") 
    profile = models.ForeignKey(Profile) 
    date_joined = models.DateTimeField(auto_now_add=True) 
    added_by = models.ForeignKey(User) 
    approved = models.BooleanField(default=False) 

अगर मैं कार्य करें:

obj, created = SocialGroupMembers.objects.get_or_create(
     social_group=social_group, profile=profile) 
    # this will give integrity error that added_by can not be null 

मैं फ़िल्टर मापदंड में added_by क्षेत्र शामिल करने के लिए नहीं करना चाहती। मैं बाद में added_by फ़ील्ड को सहेजना चाहता हूं। commit=False की तरह कुछ Django बताने के लिए है कि मैं बाद में अधिक क्षेत्रों को जोड़ने के लिए योजना है:

obj, created = SocialGroupMembers.objects.get_or_create(commit=False, 
     social_group=social_group, profile=profile) 
if created: 
    obj.added_by = request.user 
    obj.save() 
else: 
    #do something 

मैं जानता हूँ कि वहाँ के विकल्प उदा हैं मैं ObjectDoesNotExist का उपयोग कर सकता हूं। लेकिन क्या get_or_create में वांछित कार्यक्षमता प्राप्त करने का कोई तरीका है?

कारण मैं added_by फ़ील्ड को बाहर करना चाहता हूं क्योंकि ऐसा कोई अन्य उपयोगकर्ता पहले से ही एक और उपयोगकर्ता प्रोफ़ाइल जोड़ सकता है।

+2

प्रतिबद्ध जोड़ना = get_or_create गलत पर एक अच्छा है विचार। शायद आप django-developers मेलिंग सूची पर सुझाव को फ़्लोट करना चाहेंगे। – s29

उत्तर

9

एक defaults तर्क आप get_or_create को पारित कर सकते हैं नव निर्मित वस्तुओं जो छानने में इस्तेमाल नहीं कर रहे हैं के लिए इस डेटा को भरने के लिए नहीं है:

defaults = {'added_by': request.user} 
obj, created = SocialGroupMembers.objects.get_or_create(
     social_group=social_group, profile=profile, defaults=defaults) 

https://docs.djangoproject.com/en/1.4/ref/models/querysets/#get-or-create

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