विषय पर बढ़ें

स्थगित टिप्पणी

स्व-संदर्भित नमूना

जब आप संबंध बनाने के लिए घोषणा के दौरान एक ही नमूना को संदर्भित करना चाहते हैं, तो आपको संदर्भित नमूना को ForRके रूप में घोषित करने की आवश्यकता है, क्योंकि घोषणा के दौरान वर्ग तैयार नहीं है और पायथन आपको डिफ़ॉल्ट रूप से इसका संदर्भ नहीं देगा।

यद्यपि आप भविष्य के एनोटेशन या बस संदर्भ नामों का उपयोग करना चाह सकते हैं, "यह काम नहीं करेगा क्योंकि ormar का उपयोग स्पष्ट रूप से घोषित ForRके साथ किया जाना है।

सबसे पहले, आपको इनपुट से आवश्यक संदर्भ आयात करने की आवश्यकता है।

1
टाइपिंग से ForRआयात

अब हमें एक नमूना नमूना और उसी नमूना के संदर्भ की आवश्यकता है, जिसका उपयोग स्व-संदर्भित संबंध बनाने के लिए किया जाएगा।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#Person नमूना के लिए forwarf बना रहा है
पर्सनरेफ = फॉरवर्डरेफ ("व्यक्ति")


कक्षा व्यक्ति (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    # पैरामीटर के रूप में forwarf का उपयोग करें
    पर्यवेक्षक: R= ormar। विदेशी (व्यक्तित्व, संबंधित_नाम = "कर्मचारी")

यह इत्ना आसान है। लेकिन नमूना का उपयोग करने से पहले, आपको मैन्युअल रूप से संदर्भों को अपडेट करने की आवश्यकता है ताकि वे वास्तविक नमूना उत्पन्न करें।

!!!चेतावनी: यदि आप संदर्भ को अपडेट किए बिना नमूना का उपयोग करने का प्रयास करते हैं, तो एक Moअपवाद फेंक दिया जाता है। इसलिए, उपरोक्त उदाहरण में, निम्नलिखित जैसी किसी भी कॉल के परिणामस्वरूप अपवाद होगा python # creation of model - exception await Person.objects.create(name="Test") # initialization of model - exception Person2(name="Test") # usage of model's QuerySet - exception await Person2.objects.get()

संदर्भ अपडेट करने के लिए, सभी संबंधित मॉडल घोषित करने के बाद ही आगे के संदर्भों के साथ प्रत्येक नमूना पर अपडेट \ _ आगे \ _ रीफ्स विधि को कॉल करें।

इसलिए, क्रमबद्ध करना हमारे पिछले उदाहरण को ठीक से काम करने के लिए, हमें केवल एक अतिरिक्त लाइन की आवश्यकता है।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
पर्सनरेफ = फॉरवर्डरेफ ("व्यक्ति")


कक्षा व्यक्ति (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    पर्यवेक्षक: R= ormar। विदेशी (व्यक्तित्व, संबंधित_नाम = "कर्मचारी")


व्यक्ति। अद्यतन _ आगे _ संदर्भ ()

बेशक, मापदंडों के लिए और उसके माध्यम से, एक ही संक्रिया बिल्कुल उसी तरह से MToसंबंध पर किया जा सकता है।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# संदर्भ घोषित करें
चाइल्डरेफ = फॉरवर्डरेफ ("चाइल्ड")

क्लास चाइल्डफ्रेंड (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

कक्षा का बच्चा (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    # इसे संबंध में उपयोग करें
    दोस्त = ormar। MTo(ChildRef, के माध्यम से = ChildFriend,
                               संबंधित_नाम = "भी_मित्र")


बच्चा। अद्यतन _ आगे _ संदर्भ ()

क्रॉस-नमूना संबंध

स्व-संदर्भित नमूना के रूप में एक ही तंत्र और तर्क का उपयोग कई अलग-अलग मॉडलों को एक दूसरे से जोड़ने के लिए किया जा सकता है।

बेशक, ormar निर्दिष्ट का उपयोग करके आपके लिंक संबंध के दोनों पक्षों के लिए एक रिवर्स संबंध बनाएगा (or default) संबंधित \ _ नाम।

हालांकि, अगर आपको tw की आवश्यकता हैo (or more) किसी भी दो मॉडल के बीच संबंध, जो भी कारण से, उस संबंध को दोनों पक्षों पर संग्रहीत किया जाना चाहिए (इसलिए एक नमूना पर एक संबंध घोषित करें और दूसरे पर दूसरा), आपको इसे प्राप्त करने के लिए ForRका उपयोग करने की आवश्यकता है।

निम्नलिखित सरल उदाहरण पर एक नज़र डालें।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# शिक्षक अभी तक परिभाषित नहीं किया गया है
टीचररेफ = फॉरवर्डरेफ ("शिक्षक")


कक्षा का छात्र (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    # इसलिए हम वास्तविक मॉडल के बजाय संदर्भों का उपयोग करते हैं
    primary_teacher: TeacherR= ormar। विदेशी (TeacherRef,
                                                   संबंधित_नाम = "own_students")


कक्षा के छात्र शिक्षक (ormar. Model):
    ormar_config = base_ormar_config (तालिकानाम = 'छात्र_x_teachers')


कक्षा शिक्षक (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    # हमें अन्य संबंधों के लिए छात्रों की आवश्यकता है इसलिए क्रमबद्ध करना
    छात्र = ormar। MTo(छात्र, through=StudentTeacher
                                संबंधित_नाम = "शिक्षक")

# अब शिक्षक नमूना पहले से ही परिभाषित है हम संदर्भों को अपडेट कर सकते हैं
छात्र। update_forward_refs ()

!!! चेतावनी याद रखें कि कोई फर्क नहीं पड़ता कि कितने रिश्ते परिभाषित किए गए हैं, संबंधित \ _ नाम संबंधित नमूना में अद्वितीय होना चाहिए।