2011-09-18 18 views
5

यह डिज़ाइन समस्या है।मॉडल वर्ग की विधि किस तरह की विधियां होनी चाहिए?

मान लेते हैं हम Django में मॉडल इस तरह का है कि दो:

class Payment(models.Model): 
    purchase = ForeignKeyField(Purchase) 
    net_price = DecimalField() 
    is_accepted = BooleanField() 

    def set_accept(self): 
    # there will be some logic, which touch purchase, send emails etc. 

    def price_with_tax(self): 
    return net_price * (1. + TAX) 

हम भी एक और बुलाया फ़ाइल actions.py है और हम वहाँ दूसरों कार्यों को लागू। हमारी समस्या यह निर्धारित करने के लिए है कि मॉडलों.py, में actions.py में किस तरह की विधियों को निर्धारित किया जाना चाहिए। क्या आप किसी भी सामान्य दृष्टिकोण, गाइड या ऐसा कुछ जानते हैं? मैं जितना संभव हो सके मौजूदा समाधान का उपयोग करना चाहता हूं।

धन्यवाद

उत्तर

6

MVC चौखटे (Django की तरह) में समग्र सम्मेलन अपने मॉडल में जितना संभव हो उतना तर्क जगह है। यह बहुत से उद्देश्यों को पूरा करता है:

  • यह आपके तर्क को आपके डेटा (अच्छी बात) से जोड़ता है।
  • सभी डेटा मैनिपुलेशन विधियों के लिए कोड में एक स्थान को देखना आसान बनाता है।
  • आपको विचारों पर भरोसा किए बिना सीधे अपने मॉडल पर विधियों को चलाने की अनुमति देता है (परीक्षण को सरल बनाता है)।
  • आपको अपने टेम्पलेट्स में उपयोग करने के लिए वास्तव में 'साफ' एपीआई देता है, उदाहरण के लिए: {{ object.price_with_tax }}, विभिन्न व्यवहारों के लिए अलग-अलग विचारों को प्रस्तुत करने के विरोध में।
अपनी परियोजना लेआउट के लिए

आपको कोई कोड है कि अपने models.py फ़ाइल में मॉडल पर काम करता है रखने के लिए प्रयास करना चाहिए, और जब तक आप वास्तव में इसकी जरूरत एक actions.py या helpers.py का उपयोग कर से बचने की कोशिश। यदि आपके पास लंबे समय तक कोड है जो आपके models.py में डालना उचित नहीं है (शायद आप एल्गोरिदम या कुछ कार्यान्वित कर रहे हैं), सम्मेलन helpers.py का उपयोग करना है।

आपके ऐप पदानुक्रम को साफ और व्यवस्थित रखने के लिए बाद में आप बहुत कुछ कर सकते हैं, लेकिन यह सब मूलभूत बात है।

0

डीजेंगो में मानक तरीका कोड डालना है जो सीधे मॉडल में तालिका पंक्ति के आधार पर काम करता है, और कोड जो कई पंक्तियों के साथ काम करता है, या तालिका के आधार पर, प्रबंधक में। इस

>>> result = MyModel.objects.do_something_with_some_rows() 

रूप rdegges ने कहा, यह अपने एपीआई अधिक स्वच्छ और सरल उपयोग करने के लिए बनाता है, और यह भी परीक्षण करने के लिए एक बहुत आसान है

class MyManager(models.Manager): 
    def do_something_with_some_rows(self): 
     query = self.filter(...) 
     result = do_someting_with_this_query(query) 
     return result 

class MyModel(models.Model): 
    objects = MyManager() 

तो आप की तरह इस प्रबंधक का उपयोग कर सकते हैं।

https://docs.djangoproject.com/en/dev/topics/db/managers/#managers

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