2011-03-02 11 views
5

मेरे पास एक मॉडल है जिसके लिए मैं सहेजने की विधि को ओवरराइड करता हूं ताकि कुछ डेटा में सेव विधि को पारित किया जा सके और सहेजने से पहले एक फ़ील्ड भरें। यहाँ मेरी मॉडल है:Django ओवरराइड करें

class AccountModel(models.Model): 

    account = models.ForeignKey(Account) 

    def save(self, request=None, *args, **kwargs): 
     if request: 
      self.account = request.session['account'] 
     super(AccountModel, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

विचार है मैं वस्तुओं किसी खाते से संबद्ध किए जाने की जरूरत है और फिर मैं खाते कनेक्शन के साथ हर बार जब वे आते हैं निपटने के लिए नहीं होगा के लिए एक बेस मॉडल की स्थापना की (जो बहुत है)। लेकिन मैं get_or_create का भी उपयोग करना चाहूंगा, जो अनुरोध में गुजरने के बिना नई वस्तुओं को बचाता है। मुझे पता है कि get_or_create का उपयोग न करने के लिए यह करने योग्य है और इसके बजाय प्रयास करें/छोड़कर, लेकिन मैं जानना चाहता हूं कि get_or_create को ओवरराइड करने का कोई तरीका है और इसे करने का उचित तरीका क्या है।

मैंने प्रबंधक के लिए कोड देखा (जिसे मैं ओवरराइड करना चाहता हूं) और get_or_create फ़ंक्शन बस एक QuerySet get_or_create फ़ंक्शन को कॉल करता है। हो सकता है कि मैं इसे अन्य प्रबंधक कार्यों का उपयोग करने के लिए लिखूं, न कि get_or_create के QuerySet संस्करण? आप क्या सोचते हैं?

उत्तर

4

आप django.db.models.query.QuerySet उपवर्ग सकता है और अपने request कीवर्ड तर्क स्वीकार करते हैं और मुझे लगता है कि save पर इसे पारित करने के लिए वहाँ get_or_create विधि ओवरराइड, लेकिन यह बहुत सुंदर नहीं है।

class AccountQuerySet(models.query.QuerySet): 
    def get_or_create(...): 
     ... 

तब आप अपने Account मॉडल जो इस कस्टम QuerySet का उपयोग करता है के लिए एक कस्टम प्रबंधक जोड़ सकते हैं:

class AccountManager(models.Manager): 
    def get_query_set(self): 
     return AccountQuerySet(self.model) 

फिर अपने मॉडल में इस प्रबंधक का उपयोग करें:

class Account(models.Model): 
    ... 
    objects = AccountManager() 

लेकिन आपको पता चल सकता try-except विधि सभी के बाद neater है :)

+0

इससे मुझे मदद मिली जब मुझे bulk_create() को ओवरराइड करने की आवश्यकता थी। धन्यवाद! – Chad