विषय पर बढ़ें

संबंध

वर्तमान में मार दो प्रकार के संबंधों का समर्थन करता है:

  • एक से कई (and many-to-one) विदेशी क्षेत्रों के साथ
  • कई Toक्षेत्रों के साथ कई से कई

आप नीचे प्रत्येक रिश्ते की बहुत बुनियादी परिभाषाओं के उदाहरण पा सकते हैं।

विधियों, संभावनाओं, परिभाषाओं आदि के बारे में अधिक जानने के लिए, प्रलेखन के बाद के वर्गों को पढ़ें।

विदेशी कुंजी

कई-से-एक संबंध को परिभाषित करने के लिए, एक विदेशी कुंजी क्षेत्र का उपयोग करें।

 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
from typing import Dict, Optional, Union

import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Department(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Course(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    department: Optional[Union[Department, Dict]] = ormar.ForeignKey(Department)

!!! टिप्स एक-से-कई रिश्तों के बारे में अधिक जानने के लिए, विदेशी कुंजी अनुभाग पर जाएं

रिवर्स विदेशी कुंजी

एक-से-कई संबंधों की परिभाषा भी विदेशी का उपयोग करती है, जो स्वचालित रूप से आपको पंजीकृत करती है।

इसलिए, उपरोक्त उदाहरण के मामले में।

1
2
3
4
5
6
7
8
कक्षा विभाग (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    # यहाँ एक आभासी क्षेत्र इस प्रकार है
    पाठ्यक्रम: वैकल्पिक [सूची [पाठ्यक्रम]] = ormar। विदेशी (पाठ्यक्रम, आभासी = सच)
    # ध्यान दें कि आप इसे स्वयं परिभाषित नहीं करते हैं, ormar आपके लिए करता है।

!!!टिप कई-से-एक संबंधों के बारे में अधिक जानने के लिए (यानी एक उत्पन्न क्षेत्र का नाम बदलना), विदेशी कुंजी अनुभाग पर जाएं

!!!टिप seआपको क्वेरीसेट-प्रॉक्सी का उपयोग करके संबंधित मॉडल को क्वेरी करने की अनुमति देता है।

1
यह आपको उपयोग करने की अनुमति देता है `await department.courses.all()` केवल विशिष्ट विभागों आदि से संबंधित डेटा लाने के लिए।

कई से कई

कई-से-कई संबंधों को परिभाषित करने के लिए, MToफ़ील्ड का उपयोग करें।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
कक्षा श्रेणी (ormar. Model):
    ormar_config = ormar। marConfig (
        डेटाबेस = डेटाबेस,
        मेटाडेटा = मेटाडेटा,
        टेबलनाम = "श्रेणियां",
    )

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 40)

क्लास पोस्ट (ormar. Model):
    ormar_config = ormar। marConfig (
        डेटाबेस = डेटाबेस,
        मेटाडेटा = मेटाडेटा,
    )

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    शीर्षक: str = ormar। स्ट्रिंग (max_length = 200)
    श्रेणियां: वैकल्पिक [सूची [श्रेणी]] = ormar। MTo(Category)

!!! टिप्स कई-से-कई रिश्तों के बारे में अधिक जानने के लिए, कई-से-कई अनुभाग पर जाएं

!!!टिप MToआपको क्वेरीसेट-प्रॉक्सी का उपयोग करके संबंधित मॉडल को क्वेरी करने की अनुमति देता है।

1
यह आपको उपयोग करने की अनुमति देता है `await post.categories.all()` लेकिन यह भी `await category.posts.all()` केवल विशिष्ट पदों, श्रेणियों आदि से संबंधित डेटा लाने के लिए।

खेतों के माध्यम से

MToसंबंध के हिस्से के रूप में, आप एक पास-थ्रू नमूना को परिभाषित कर सकते हैं जिसमें अतिरिक्त फ़ील्ड हो सकते हैं जिनका उपयोग फ़िल्टरिंग, सॉर्टिंग आदि के लिए किया जा सकता है। इस तरह परिभाषित फ़ील्ड m2m नमूना में वर्तमान क्वेरी के रिवर्स साइड पर उजागर होंगे।

इसलिए, यदि आप नमूना ए से नमूना बी तक क्वेरी करते हैं, तो केवल नमूना बी क्षेत्र के माध्यम से उजागर करता है। जो समझ में आता है क्योंकि यह प्रत्येक संबंधित क्षेत्र के लिए एक तरफ़ा नमूना नमूना के लिए एक तरफ़ा / क्षेत्र है।

 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
30
31
32
कक्षा श्रेणी (ormar. Model):
    ormar_config = ormar। marConfig (
        डेटाबेस = डेटाबेस,
        मेटाडेटा = मेटाडेटा,
        टेबलनाम = "श्रेणियां",
    )

    आईडी = ormar। पूर्णांक (primary_key = True)
    नाम = ormar। स्ट्रिंग (max_length = 40)

# आप मॉडल के माध्यम से अतिरिक्त फ़ील्ड निर्दिष्ट कर सकते हैं
कक्षा पोस्टश्रेणी (ormar. Model):
    ormar_config = ormar। marConfig (
        डेटाबेस = डेटाबेस,
        मेटाडेटा = मेटाडेटा,
        टेबलनाम = "पोस्ट _ x _ श्रेणियां",
    )

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    सॉर्ट _ ऑर्डर: int = ormar। पूर्णांक (nullable = True)
    param_name: str = ormar। स्ट्रिंग (default = "नाम", max_length = 200)


क्लास पोस्ट (ormar. Model):
    ormar_config = ormar। marConfig (
        डेटाबेस = डेटाबेस,
        मेटाडेटा = मेटाडेटा,
    )

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    शीर्षक: str = ormar। स्ट्रिंग (max_length = 200)
    श्रेणियाँ = ormar। कई through=PostCategory

!!!टिप कई-से-कई रिश्तों और क्षेत्रों के बारे में अधिक जानने के लिए, कई-से-कई अनुभाग पर जाएं

!!!टिप MToआपको क्वेरीसेट-प्रॉक्सी का उपयोग करके संबंधित मॉडल को क्वेरी करने की अनुमति देता है।

1
यह आपको उपयोग करने की अनुमति देता है `await post.categories.all()` लेकिन यह भी `await category.posts.all()` केवल विशिष्ट पदों, श्रेणियों आदि से संबंधित डेटा लाने के लिए।

संबंध डिफ़ॉल्ट सॉर्ट क्रमबद्ध करना

डिफ़ॉल्ट रूप से, रिश्ते नमूना डिफ़ॉल्ट सॉर्ट क्रमबद्ध करना का पालन करते हैं, इसलिए प्राथमिक \ _ कुंजी कॉलम आरोही क्रमबद्ध करना में हैं, या ऑब्जेक्ट में किसी भी प्रकार क्रमबद्ध करना को ormar \ _ कॉन्फ़िगर करें।

!!! टिप नमूना सॉर्टिंग क्रमबद्ध करना के बारे में अधिक जानने के लिए, प्रलेखन के मॉडल अनुभाग पर जाएं

हालाँकि, आप उस क्रमबद्ध करना को संशोधित कर सकते हैं जिसमें संबंधित मॉडल किसी क्वेरी के दौरान लोड किए जाते हैं, आदेशों के साथ संबंध की आपूर्ति करके \ _ by और संबंधित \ _ आदेशों \ _ मापदंडों द्वारा।

एक रिश्ते में, आप केवल सीधे संबंधित नमूना स्तंभों द्वारा सॉर्ट कर सकते हैं, या कई-से-कई स्तंभों के लिए, आप नमूना स्तंभों द्वारा भी सॉर्ट कर सकते हैं {through_field_name}__{column_name}

एक उदाहरण कॉन्फ़िगरेशन इस तरह दिख सकता है:

 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
डेटाबेस = डेटाबेस। डेटाबेस (DATABASE_URL)
मेटाडेटा = वर्गधर्मी। मेटाडेटा ()


base_ormar_config = ormar। marConfig (
    डेटाबेस = डेटाबेस,
    मेटाडेटा = मेटाडेटा,
)


कक्षा लेखक (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)


क्लास बुक (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    लेखक: वैकल्पिक [लेखक: = ormar। विदेशी कुंजी (
        लेखक, आदेश_बाय = ["नाम"], संबंधित_आदेश_बाय = ["-year"]
    )
    शीर्षक: str = ormar। स्ट्रिंग (max_length = 100)
    वर्ष: int = ormar। पूर्णांक (nullable = True)
    रैंकिंग: int = ormar। पूर्णांक (nullable = True)

अब कॉल करें:

await Author.objects.select_related("books").get() अवरोही क्रमबद्ध करना में पुस्तक वर्ष द्वारा पुस्तकों को क्रमबद्ध किया जाएगा

await Book.objects.select_related("author").all() लेखकों को आरोही क्रमबद्ध करना में लेखक के नाम से क्रमबद्ध किया जाएगा

स्व-संदर्भ और आस्थगित संदर्भ

क्रमबद्ध करना एक स्वचालित संबंध बनाने के लिए या दो मॉडल बनाने के लिए जो कम से कम दो अलग-अलग संबंधों में एक-दूसरे को संदर्भित करते हैं (याद रखें कि रिवर्स स्वचालित रूप से आपके लिए पंजीकृत है), आपको इनपुट मॉड्यूल में ForRका उपयोग करने की आवश्यकता है।

 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। विदेशी (व्यक्तित्व, संबंधित_नाम = "कर्मचारी")


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

!!! टिप्स स्व-संदर्भित और आस्थगित संबंधों के बारे में अधिक जानने के लिए, आस्थगित टिप्पणी अनुभाग पर जाएं