2013-03-18 4 views
7

मेरे पास एक Django मॉडल है जिसे स्टाफसेटिंग कहा जाता है जिसमें मेरे Django ऐप में उपयोगकर्ताओं के लिए विभिन्न कॉन्फ़िगरेशन विकल्प होते हैं। प्रत्येक उपयोगकर्ता के पास StaffSettings तालिका में सबसे अधिक प्रविष्टि होती है।क्या get_or_create करने के लिए एक बेवकूफ तरीका है तो Django में किसी ऑब्जेक्ट को अपडेट करें?

मान लें कि एक सेटिंग default_year_level है, और मेरे उपयोगकर्ता के लिए की तरह वस्तुओं मैं कोड है:

def set_default_year_level(u, year_level): 
    obj, _created = StaffSettings.objects.get_or_create(user=u) 
    obj.default_year_level = year_level 
    obj.save() 

मैं समारोह के शरीर पसंद करते हैं एक लाइन पर फिट करने के लिए है क्योंकि यह एक आम उपयोग की तरह लगता है होता है, लेकिन अगर मैं इसे

def set_default_year_level(u, year_level): 
    StaffSettings.objects.filter(user=u).update(default_year_level=year_level) 

जो ठीक काम करता है, तो प्रश्न का उपभोक्ता पहले से ही StaffSettings तालिका में एक पंक्ति है के रूप में परिभाषित है, लेकिन अगर यह मौजूद नहीं है यह प्रासंगिक पंक्ति नहीं बनाएगा।

कोड करने के लिए बेवकूफ/सर्वोत्तम तरीका क्या है? (उदाहरण के लिए filter_or_create फ़ंक्शन का कोई प्रकार है? या अन्य लोग इस मुहावरे को संभालने के लिए सजावटी/सहायक कार्यों को लिखते हैं?)

उत्तर

5

मुझे आपके पहले फ़ंक्शन के साथ कोई समस्या नहीं दिखाई दे रही है, तो मैंने इस उपयोग के लिए इसे लिखा होगा ।

लेकिन अगर आप अपने मॉडल पर क्षेत्रों का एक बहुत पर एक ही सुविधा की जरूरत है और आप अपने आप को दोहराने के लिए नहीं करना चाहते हैं आप पैरामीटर के रूप में क्षेत्र पारित कर सकते हैं:

def set_default_value(u, field, value): 
    obj, _created = StaffSettings.objects.get_or_create(user=u) 
    setattr(obj, field, value) 
    obj.save() 

और मैं से दूर रहना होगा अद्यतन() समारोह वैसे भी रूप में इस समारोह एक साथ कई वस्तुओं को अद्यतन करने के लिए है और विधि है और न ही संकेत अपने मॉडल को बचाने के() ट्रिगर नहीं करता (https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once देखें)

+0

अद्यतन() के साथ कमी का उल्लेख करने के लिए धन्यवाद। मुझे लगता है कि मैंने एक बार पढ़ा था लेकिन भूल गया था। मैंने आपके द्वारा प्रस्तावित किए गए कुछ के समान कुछ किया है, लेकिन इसके बजाय set_default_values ​​(u, ** kwargs) बनाया है ताकि मुझे फ़ील्ड के लिए स्ट्रिंग पास न करनी पड़े, और इसके बजाय set_default_values ​​(u, default_year_level = year_level) जैसे कोड लिख सकते हैं। । – bryn

2

Django 1.7 जब से तुम update_or_create() उपयोग कर सकते हैं:

def set_default_year_level(u, year_level): 
    obj, _created = StaffSettings.objects.update_or_create(
     user=u, 
     default_year_level=year_level 
    ) 

या, एक अधिक सामान्य मामले पिछले जवाब में बताई गई विधि के लिए:

def set_default_values(u, **kwargs): 
    obj, _created = StaffSettings.objects.update_or_create(user=u, defaults=kwargs) 

जो भी अपने अतिरिक्त आवश्यकता को प्राप्त होता है

मैं समारोह पर फिट करने के लिए के शरीर पसंद करेंगे एक पंक्ति

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