16

उदाहरण के लिए, खाते का 1 -> * उपयोगकर्ता -> 1 प्रमाणीकरण 1 खाते से अधिक उपयोगकर्ता हैं और प्रत्येक उपयोगकर्ता 1 प्रमाणीकरणकहाँ Django में व्यापार तर्क डाल करने के लिए

मैं इतना जावा पृष्ठभूमि से आना होगा क्या मैं आमतौर पर करते हैं

  1. , जावा सेम के रूप में इन वर्गों (यानी, केवल मनुष्य और सेटर, कोई तर्क संलग्न)
  2. खाता प्रबंधक EJB वर्ग बनाने परिभाषित CREATE_ACCOUNT विधि को परिभाषित (1 खाता लेता है के साथ, उपयोगकर्ताओं की सूची) है
  3. वेब परत में डेटा को तैयार है, तो खाता प्रबंधक EJB में डेटा पास, उदाहरण के लिए: accountManager.createAccount(account, userList)

लेकिन Django में, ढांचे अधिवक्ताओं कि आप मॉडल वर्गों (पंक्ति स्तर) या संबद्ध प्रबंधक वर्गों में डोमेन तर्क रखा (टेबल स्तर), जो चीजों को थोड़ा अजीब बनाता है। हां, यह ठीक है कि यदि आपके तर्क में केवल एक तालिका शामिल है, लेकिन असली एप्लिकेशन में, आमतौर पर प्रत्येक चरण में कई अलग-अलग टेबल या डेटाबेस भी शामिल होंगे, तो मुझे इस मामले में क्या करना चाहिए?

तर्क को देखें में रखें? मुझे नहीं लगता कि यह बिल्कुल अच्छा अभ्यास है। या ** वर्ग के उपयोग से अतिरिक्त डेटा में गुजरने, मॉडल वर्ग में सहेजने की विधि को भी ओवरराइट करें? तो बैकएंड टूट जाएगा।

मुझे उम्मीद है कि यह मेरे भ्रम को दिखाता है जहां व्यापार तर्क को डीजेंगो एप्लिकेशन में रखा जाना चाहिए।

उत्तर

0

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

12

सुनिश्चित नहीं है कि आपने Django में Managers पर अनुभाग पढ़ लिया है, तो यह आपकी वर्तमान स्थिति को हल करने लगता है। मान लें कि आपके पास निम्नलिखित Account मॉडल परिभाषित हैं, User अंतर्निहित है।

# accounts/models.py 

class AccountManager(models.Manager): 
    def create_account(self, account, user_list): 
     ... 

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

यदि यह बहुत बड़ा हो तो अपने प्रबंधक कोड को एक अलग फ़ाइल में अलग करने के लिए स्वतंत्र महसूस करें। आपके विचारों में:

# views.py 

from accounts.models import Account 

Account.objects.create_account(account, user_list) 

व्यापार तर्क अभी भी मॉडल में है।

संपादित

कीवर्ड यहाँ ओवरराइड है, अधिलेखित नहीं। यदि आप मॉडल की सहेजने की विधि को ओवरराइड करते हैं, तो आपको यह ध्यान रखना होगा कि आपके वेब ऐप और व्यवस्थापक के भीतर से कोई भी निर्माण, अपडेट ऑपरेशन इस नई कार्यक्षमता का उपयोग करेगा। यदि आप केवल उन व्यावसायिक तर्कों को एक विशिष्ट दृश्य में एक बार करना चाहते हैं, तो इसे save से बाहर रखना सर्वोत्तम हो सकता है।

मुझे लगता है कि आप अपने व्यावसायिक तर्क को अपनी नियमित कक्षा में डाल सकते हैं। प्रत्येक बार जब आपको अपना व्यावसायिक तर्क चलाने की आवश्यकता होती है तो आपको उस कक्षा को तुरंत चालू करना होगा। वैकल्पिक रूप से, यदि आप ओओपी दृष्टिकोण को छोड़ना चाहते हैं तो आप इस नए वर्ग में एक स्थिर कार्य के रूप में अपना व्यावसायिक तर्क डाल सकते हैं।

+0

हाय थियरी, आप को बचाने के अधिलेखित विधि अच्छा विचार है लगता है? भी। प्रबंधक स्तर वस्तु तालिका स्तर तर्क पर अधिक केंद्रित होना चाहिए? (सिर्फ उत्सुक है, क्योंकि अब मैं आपके दृष्टिकोण से बहुत आश्वस्त हूं) – devharb

+0

संपादित उत्तर देखें। –

2

मैं जो कर रहा हूं वह यह है कि मेरे अधिकांश ऐप्स में व्यवसाय तर्क के साथ service.py फ़ाइल है।इसका कारण यह है कि अगर मैं एक समारोह है कि एक साथ कई एप्लिकेशन से मॉडलों के साथ काम करता है की जरूरत है मैं बस यह नहीं कर सकता:

# shop/models.py 
from auth.models import User, Team 

इस कोड को वृत्तीय संदर्भ चक्र में फँस जाएगा।

लेकिन मैं इस कदम इस तरह संरचना के साथ ऐप्लिकेशन service.py से सबसे अधिक संभावना कर रहा हूँ:

service/ 
    auth.py 
    customers.py 
    another_set_of_functions.py 
    ... 
संबंधित मुद्दे