विषय पर बढ़ें

विरासत

विभिन्न प्रकार के ओआरएम नमूना विरासत में से, ओरमार वर्तमान में उनमें से दो का समर्थन करता है:

  • में मिश्रण
  • कंक्रीट टेबल विरासत (सार के लिए मूल सेट = सच)

विरासत प्रकार

विभिन्न प्रकार की विरासत का एक संक्षिप्त सारांश:

  • मिक्सिंस \ [support ] - उपवर्ग ormar न करें। मॉडल, बस विभिन्न मॉडलों पर बाद में उपयोग किए जाने वाले फ़ील्ड को परिभाषित करें (जैसे प्रत्येक नमूना पर बनाया गया \ _ दिनांक और अपडेट किया गया), केवल वास्तविक नमूना तालिका बनाता है, लेकिन मिश्रण में फ़ील्ड जोड़ें
  • कंक्रीट टेबल इनहेरिटेंस \ [SUPPORTED ] - माध्य कि माता-पिता को अमूर्त के रूप में चिह्नित किया गया है, और प्रत्येक बच्चे की अपनी तालिका है जिसमें माता-पिता और उसके स्वयं के बच्चे कॉलम हैं, कुछ हद तक मिक्सिंस के समान है, लेकिन माता-पिता भी एक नमूना
  • एकल तालिका विरासत \ [समर्थित नहीं ] - माध्य है कि केवल एक तालिका बनाई गई है जहां फ़ील्ड मूल नमूना और सभी बच्चे मॉडल के संयोजन / योग हैं, लेकिन बच्चा नमूना केवल डेटाबेस में स्तंभों के सबसेट का उपयोग करता है (सभी मूल मॉडल और उनके स्वयं के कॉलम, अन्य बच्चे मॉडल को छोड़कर)
  • मल्टीपल / जॉइन टेबल इनहेरिटेंस \ [समर्थित नहीं ] - माध्य कि कुछ कॉलम पैरेंट नमूना पर संग्रहीत किए जाते हैं और कुछ चाइल्ड नमूना पर संग्रहीत किए जाते हैं, वे एक-से-एक रिश्ते में एक-दूसरे से जुड़े होते हैं, और दो मॉडल तुरंत पृष्ठभूमि में संचालित होते हैं
  • प्रॉक्सी नमूना \ [समर्थन नहीं करता है] - माध्य कि केवल माता-पिता के पास एक वास्तविक तालिका है, और बच्चा सिर्फ तरीके जोड़ता है, सेटिंग्स को संशोधित करता है, आदि।

में मिश्रण

मिक्सिंस का उपयोग करने के लिए, बस एक ऐसे वर्ग को परिभाषित करें जो ormar से विरासत में नहीं मिला है। मॉडल, लेकिन ormar को परिभाषित करता है। एक वर्ग चर के रूप में क्षेत्र।

 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
base_ormar_config = ormar। marConfig (
    डेटाबेस = डेटाबेस। डेटाबेस (DATABASE_URL),
    मेटाडेटा = वर्गधर्मी। मेटाडेटा (),
    इंजन = sqlal (DATABASE_URL),
)


# एक मिक्सिन खेतों को परिभाषित करता है लेकिन एक सामान्य अजगर वर्ग है
क्लास ऑडिटमिक्सिन:
    created_by: str = ormar। स्ट्रिंग (max_length = 100)
    updated_by: str = ormar। स्ट्रिंग (max_length = 100, डिफ़ॉल्ट = "Sam")


कक्षा DateFieldsMixins:
    creat_date: date.datetime = ormar। datetime.datetime.now
    updated_date: date.datetime = ormar। datetime.datetime.now


# एक मॉडल एक या अधिक मिश्रण से विरासत में मिल सकता है
कक्षा श्रेणियां (ormar. Model, DateFieldsMixins, oditMixin):
    ormar_config = base_ormar_config (टेबलनाम = "श्रेणियाँ")

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 50, अद्वितीय = True, सूचकांक = True)
    कोड: int = ormar। पूर्णांक ()

!!!ध्यान दें कि मिक्सिन एक नमूना नहीं है, इसलिए आपको अभी भी ormar से विरासत में मिला है। मॉडल और अंतिम नमूना में ormar \ _ config फ़ील्ड को परिभाषित करें।

ऊपर दिए गए श्रेणी वर्ग में चार अतिरिक्त फ़ील्ड होंगे: निर्मित \ _ तिथि, अद्यतन \ _ तिथि, निर्मित \ _ द्वारा, और अद्यतन \ _ द्वारा।

नमूना श्रेणी के लिए केवल एक तालिका बनाई जाएगी, जहां श्रेणी वर्ग फ़ील्ड को सभी मिक्सिंस फ़ील्ड के साथ जोड़ा जाता है।

कृपया ध्यान दें कि कक्षा के नाम में मिक्सिन वैकल्पिक है, लेकिन यह एक अच्छा पायथन अभ्यास है।

कंक्रीट टेबल विरासत

वैचारिक रूप से, कंक्रीट टेबल इनहेरिटेंस मिक्सिंस के समान है, लेकिन वास्तविक ऑर्मर का उपयोग करना। बेस क्लास के रूप में मॉडल।

!!!चेतावनी ध्यान दें कि बेस क्लास में सार = ormar \ _ config ऑब्जेक्ट में सही सेट है, जो ModelDefinitionError फेंकता है यदि आप एक गैर-अमूर्त मार्कअप क्लास से विरासत में लेने की कोशिश करते हैं।

चूंकि यह सार नमूना कभी भी आरंभ नहीं किया जाता है, इसलिए आप मेटाडेटा और डेटाबेस को इसकी ormar \ _ config परिभाषा में छोड़ सकते हैं।

लेकिन अगर आप इसे प्रदान करते हैं - तो यह विरासत में मिला होगा ताकि आपको अंतिम / कंक्रीट वर्ग में मेटाडेटा और डेटाबेस प्रदान न करना पड़े

कृपया ध्यान दें कि यदि आवश्यक हो तो आप इसे हमेशा बच्चे / कंक्रीट वर्ग में ओवरराइड कर सकते हैं।

क्या अधिक है, विरासत श्रृंखला में कम से कम एक वर्ग को डेटाबेस और मेटाडेटा प्रदान करना होगा - अन्यथा एक त्रुटि उठाई जाएगी।

 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
# ध्यान दें कि आधार वर्गों में सार = सत्य है
# इस नमूना को कभी भी इनिशियलाइज़ नहीं किया जाएगा आप मेटाडेटा और डेटाबेस को छोड़ सकते हैं
क्लास ऑडिटमॉडल (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    created_by: str = ormar। स्ट्रिंग (max_length = 100)
    updated_by: str = ormar। स्ट्रिंग (max_length = 100, डिफ़ॉल्ट = "Sam")


# लेकिन अगर आप इसे प्रदान करते हैं तो यह विरासत में मिल जाएगा - Y (डोंट रिपीट योरसेल्फ) एक्शन में
कक्षा Dateelds (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी (
        सार = सच,
        मेटाडेटा = मेटाडेटा,
        डेटाबेस = डीबी,
    )

    creat_date: date.datetime = ormar। datetime.datetime.now
    updated_date: date.datetime = ormar। datetime.datetime.now


# इस तरह से आपको कंक्रीट कक्षाओं में मेटाडेटा और डेटाबेस प्रदान करने की आवश्यकता नहीं है
कक्षा श्रेणी (DateFieldsModel, AuditModel):
    ormar_config = base_ormar_config (टेबलनाम = "श्रेणियाँ")

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 50, अद्वितीय = True, सूचकांक = True)
    कोड: int = ormar। पूर्णांक ()

विरासत में मिले विकल्पों / सेटिंग्स की सूची इस प्रकार है: मेटाडेटा, डेटाबेस और बाधाएं।

बेशक, इसके अलावा, बेस क्लास के सभी क्षेत्रों को संयुक्त किया जाता है और अंतिम नमूना की कंक्रीट तालिकाओं में बनाया जाता है।

!!!कृपया ध्यान दें कि आपको अंतिम कक्षा में abct = गलत प्रदान करने की आवश्यकता नहीं है - यह डिफ़ॉल्ट सेटिंग है जो विरासत में नहीं मिली है।

उपवर्गों में फ़ील्ड को फिर से परिभाषित करें

कृपया ध्यान दें कि आप सामान्य पायथन वर्ग विरासत की तरह पहले से बनाए गए क्षेत्रों को फिर से परिभाषित कर सकते हैं।

हर बार जब आप एक ही नाम और एक नई परिभाषा के साथ एक क्षेत्र को परिभाषित करते हैं, तो यह पहले से परिभाषित क्षेत्र को पूरी तरह से बदल देता है।

 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
33
34
35
36
37
38
39
# बेस क्लास
कक्षा Dateelds (ormar. Model):
    ormar_config = marConfig (
        सार = सच,
        मेटाडेटा = मेटाडेटा,
        डेटाबेस = डीबी,
        # ध्यान दें कि Uniको sqlalchdb कॉलम नामों की आवश्यकता है न कि ormar वाले
        बाधाओं = [ormar। Uni("creation_date", "modition_date")]
    )

    बनाया गया तारीख: date.datetime = ormar। दिनांक समय (
        डिफ़ॉल्ट = datetime.datetime.now नाम = "creation_date"
    )
    updated_date: date.datetime = ormar। दिनांक समय (
        डिफ़ॉल्ट = datetime.datetime.now नाम = "संशोधन _ तारीख"
    )


कक्षा पुनर्परिभाषित (DateFieldsModel):
    ormar_config = marConfig (
        टेबलनाम = "पुनर्परिभाषित",
        मेटाडेटा = मेटाडेटा,
        डेटाबेस = डीबी,
    )

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    # यहाँ बनाया_डेट स्ट्रिंग फ़ील्ड द्वारा प्रतिस्थापित किया गया है
    बनाया गया तारीख: str = ormar। स्ट्रिंग (max_length = 200, नाम = "creation_date")


# आप सत्यापित कर सकते हैं कि अंतिम क्षेत्र सही ढंग से घोषित और बनाया गया है
बदले_फील्ड = Reedeld.ormar_config model_fields ["बनाया_तारीख"]
परिवर्तित _ फ़ील्ड डिफ़ॉल्ट कोई नहीं है
परिवर्तित _ फ़ील्ड उपनाम = = "creation_date"
Reedeld.ormar_config .में x के लिए कोई भी x.name = "creation_date")
जोर देना है (
    Reedormar_config टेबल.कॉलम ["creation_date"]। टाइप,
    Sqlalchemy.sql.sqltyps। स्ट्रिंग,
)

!!!चेतावनी यदि आप कॉलम नामों के साथ Uniकी बाधाओं की घोषणा करते हैं, तो अंतिम नमूना को उसी नाम के साथ कॉलम घोषित करना होगा। अन्यथा, ModelDefinitionError उठाया जाता है।

1
2
3
4
5
6
तो ऊपर उदाहरण में यदि आप प्रदान नहीं करते हैं `name` के लिए `created_date` में `RedefinedField` मॉडल
ओरमार शिकायत करेगा।

`created_date: str = ormar.String(max_length=200) # exception`

`created_date: str = ormar.String(max_length=200, name="creation_date2") # exception`

विरासत संबंध

आप विरासत के हर कदम पर रिश्तों की घोषणा कर सकते हैं, चाहे वह माता-पिता वर्ग में हो या बच्चे वर्ग में।

जब आप बच्चे के नमूना स्तर पर एक रिश्ते को परिभाषित करते हैं, तो यह माता-पिता के नमूना में परिभाषित रिश्ते को ओवरराइड करता है (यदि उसी क्षेत्र के नाम का उपयोग किया जाता है), या यदि आप एक नए रिश्ते को परिभाषित करते हैं, तो इसे केवल उस बच्चे द्वारा एक्सेस किया जा सकता नमूना है।

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

यदि आप संबंधित \ _ नाम तर्क प्रदान नहीं करते हैं, तो ormar आपके लिए इसकी गणना करेगा। यह विरासत पर लागू होता है, क्योंकि सभी सबमॉडल में अलग-अलग वर्ग नाम होने चाहिए, जिनका उपयोग डिफ़ॉल्ट संबंधित \ _ नाम की गणना करने के लिए किया जाता है (class.name () +')।

हालाँकि, यदि आप संबंधित \ _ नाम प्रदान करते हैं, तो नाम का सभी सबमॉडल में पुन: उपयोग नहीं किया जा सकता है क्योंकि वे संबंधित नमूना पर एक दूसरे को ओवरराइड करते हैं।

इसलिए, आपके पास दो विकल्प हैं:

  • सबमॉडल में संबंधपरक फ़ील्ड को फिर से परिभाषित करें और मैन्युअल रूप से विभिन्न संबंधित \ _ नाम पैरामीटर प्रदान करें
  • ormar हैंडल करने दें -> ऑटो-एडजस्ट संबंधित \ _ नाम: मूल संबंधित _नाम + "_"+ सबमॉडल टेबल नाम

यह जटिल लग सकता है, लेकिन आइए निम्नलिखित उदाहरण पर एक नज़र डालें:

विदेशी कुंजी संबंध

 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
# सामान्य नमूना संबंध में उपयोग किया जाता है
कक्षा व्यक्ति (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

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


# नमूना - अमूर्त होने की जरूरत है
क्लास कार (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 50)
    मालिक: व्यक्ति = ormar। विदेशी (व्यक्ति)
    # ध्यान दें कि हम नमूना फिर से व्यक्ति को संदर्भित करते हैं इसलिए हम **करना है** संबंधित _ नाम प्रदान करें
    co_owner: व्यक्ति = ormar। विदेशी (व्यक्ति, संबंधित_नाम = "coowned")
    creat_date: date.datetime = ormar। datetime.datetime.now


क्लास ट्रक (कार):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    अधिकतम_क्षमता: int = ormar। पूर्णांक ()


क्लास बस (कार):
    ormar_config = आधार_ormar_config (tablename = "buses")

    max_persons: int = ormar। पूर्णांक ()

अब, जब आप व्यक्ति नमूना पर फ़ील्ड की जाँच करेंगे, तो आपको मिलेगा:

1
2
3
4
5
6
7
8
9
व्यक्ति ormar_config मॉडल_फील्ड्स
"""
{'आईडी':<class 'ormar.fields.model_fields.Integer'>,
'नाम':<class 'ormar.fields.model_fields.String'>,
'ट्रक':<class 'ormar.fields.foreign_key.ForeignKey'>,
'coowned_tricks': <class 'ormar.fields.foreign_key.ForeignKey'>, 
'बुस':<class 'ormar.fields.foreign_key.ForeignKey'>,
cowned_buss ':<class 'ormar.fields.foreign_key.ForeignKey'>}
"""

ध्यान दें कि आप ट्रक और बस फ़ील्ड के मालिक कैसे हैं, जो ट्रक और बस श्रेणी का नेतृत्व करते हैं जो इस व्यक्ति का मालिक है। कोई संबंधित \ _ नाम पैरामीटर नहीं है, इसलिए डिफ़ॉल्ट नाम का उपयोग किया जाता है।

सह-स्वामित्व वाली कारों को cow\ _ ट्रकों और w\ _ बसों द्वारा संदर्भित करने की आवश्यकता है। मार सबमॉडल तालिका नामों से लिए गए \ _ ट्रकों और \ _ बसों प्रत्ययों को जोड़ता है।

यह अच्छा लग रहा है, लेकिन स्वामित्व वाले ट्रक का डिफ़ॉल्ट नाम ठीक है (ट्रक) है, लेकिन बस बदसूरत है, इसलिए हम इसे कैसे बदलते हैं?

समाधान बहुत सरल है - बस कक्षा में फ़ील्ड को फिर से परिभाषित करें और विभिन्न संबंधित \ _ नाम पैरामीटर प्रदान करें।

1
2
3
4
5
6
7
उपरोक्त उदाहरण के बाकी समान रहता है
क्लास बस (कार):
    ormar_config = आधार_ormar_config (tablename = "buses")

    # नया फ़ील्ड जो संबंधित_नाम बदलता है
    मालिक: व्यक्ति = ormar। विदेशी (व्यक्ति, संबंधित_नाम = "बसें")
    max_persons: int = ormar। पूर्णांक ()

कॉलम अब बहुत बेहतर लग रहा है।

1
2
3
4
5
6
7
8
9
व्यक्ति ormar_config मॉडल_फील्ड्स
"""
{'आईडी':<class 'ormar.fields.model_fields.Integer'>,
'नाम':<class 'ormar.fields.model_fields.String'>,
'ट्रक':<class 'ormar.fields.foreign_key.ForeignKey'>,
'coowned_tricks':<class 'ormar.fields.foreign_key.ForeignKey'>,
'बसें':<class 'ormar.fields.foreign_key.ForeignKey'>,
cowned_buss ':<class 'ormar.fields.foreign_key.ForeignKey'>}
"""

!!!ध्यान दें कि आप स्वामी फ़ील्ड के लिए संबंधित \ _ नाम भी प्रदान कर सकते हैं, जो सही प्रत्यय जोड़ता है।

1
2
3
`owner: Person = ormar.ForeignKey(Person, related_name="owned")`

और नमूना स्वामित्व वाली कारों के लिए क्षेत्र बन जाएंगे `owned_trucks` और `owned_buses` हाँ।

कई से कई रिश्ते

इसी तरह, आप एक नमूना से विरासत में मिल सकते हैं जो एक MToसंबंध घोषित करता है, लेकिन एक पर्याप्त अंतर के साथ - थ्रू नमूना

चूंकि थ्रू नमूना अन्य क्षेत्रों को रखने में सक्षम होगा, और अब यह केवल दो तालिकाओं को जोड़ता है (from and one table), प्रत्येक बच्चा जो M2M संबंधपरक क्षेत्र को विरासत में देता है, उसके पास एक अलग थ्रू नमूना होना चाहिए।

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

एक बार फिर, आइए अवधारणा को अधिक आसानी से समझने के लिए एक उदाहरण पर एक नज़र डालें।

हम सह \ _ मालिकों के 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
33
34
35
36
37
# व्यक्ति ऊपर के समान रहता है
कक्षा व्यक्ति (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

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

# व्यक्ति और 2 के बीच नमूना के माध्यम से
कक्षा के व्यक्ति (ormar. Model):
    ormar_config = base_ormar_config (टेबलनाम = "कार_x_persons")

#note कैसे co_owners अब MToसंबंध है
कक्षा 2 (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 50)
    # संबंधित_नाम पर ध्यान दें - व्यक्ति भर में अद्वितीय होने की आवश्यकता है
    #modeling, भले ही कितने अलग-अलग मॉडल पर्सन की ओर ले जाएं
    मालिक: व्यक्ति = ormar। विदेशी (व्यक्ति, संबंधित_नाम = "स्वामित्व")
    co_owners: सूची [व्यक्ति] = ormar। MTo(
        व्यक्ति, के माध्यम से = व्यक्ति, संबंधित_नाम = "coowned"
    )
    creat_date: date.datetime = ormar। datetime.datetime.now


# चाइल्ड मॉडल केवल अतिरिक्त फील्ड्स को परिभाषित करते हैं
क्लास ट्रक 2 (Car2):
    ormar_config = base_ormar_config (टेबलनाम = "ट्रक 2")

    अधिकतम_क्षमता: int = ormar। पूर्णांक ()


क्लास बस 2 (Car2):
    ormar_config = आधार_ormar_config (tablename = "buses2")

    max_persons: int = ormar। पूर्णांक ()

सबमॉडल की तालिका नाम शामिल करने के लिए किसी फ़ील्ड के संबंधित \ _ नाम को स्वचालित रूप से संशोधित करता है। डिफ़ॉल्ट नाम मूल संबंधित \ है_नाम + '_'+ सबटेबल नाम।

इस तरह, ट्रक 2 वर्ग के लिए, संबंध परिभाषित किया गया है owner: Person = ormar.ForeignKey(Person, related_name="owned") स्वामित्व वाले \ _ ट्रक 2 बनें

आप व्यक्ति नमूना पर मौजूद फ़ील्ड की सूची की जाँच करके नाम सत्यापित कर सकते हैं।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
व्यक्ति ormar_config मॉडल_फील्ड्स
{
# ध्यान दें कि सभी संबंध क्षेत्रों को व्यक्ति पर अद्वितीय होने की आवश्यकता है
# भले ही ऑटोजनरेटेड या मैन्युअल रूप से ओवरराइट किया गया हो
'आईडी': <class 'ormar.fields.model_fields.Integer'>, 
'नाम':<class 'ormar.fields.model_fields.String'>,
# ध्यान दें कि हमने पिछले उदाहरणों पर विस्तार किया है इसलिए सभी 'फ़ील्ड यहाँ हैं
'ट्रक':<class 'ormar.fields.foreign_key.ForeignKey'>,
'coowned_tricks':<class 'ormar.fields.foreign_key.ForeignKey'>,
'बसें':<class 'ormar.fields.foreign_key.ForeignKey'>,
'coowned_buses':<class 'ormar.fields.foreign_key.ForeignKey'>,
# नए परिभाषित संबंधित क्षेत्र
स्वामित्व_ट्रक 2 ':<class 'ormar.fields.foreign_key.ForeignKey'>,
'coowned_truks2':<class 'abc.ManyToMany'>,
स्वामित्व _buses2 ':<class 'ormar.fields.foreign_key.ForeignKey'>,
'coowned_buses2': <class 'abc.ManyToMany'>
}

लेकिन यह सब नहीं है। यह ormar की आंतरिक संरचना है, लेकिन यह डेटाबेस में डेटा संरचना को प्रभावित करता है, इसलिए आइए 2 और Tr2 मॉडल के लिए पास-थ्रू नमूना की जांच करें।

1
2
3
4
5
6
7
8
9
2.ormar_config model_fields ['co_owners']।
<class 'abc.PersonsCarBus2'>
2. ormar_config model_fields ['co_owners']। ormar_config। टेबलनाम
'कार_x_persons_buses2'

ट्रक 2। ormar_config model_fields ['co_owners']। के माध्यम से
<class 'abc.PersonsCarTruck2'>
ट्रक 2। ormar_config model_fields ['co_owners']। ormar_config टेबलनाम
'कार_x_persons_trucks2'

जैसा कि आप ऊपर देख सकते हैं, प्रत्येक उपवर्ग के लिए थ्रू नमूना क्लोन करता है, अंत में उपवर्ग नाम जोड़ता है, और बच्चे के तालिका नाम का उपयोग करने के लिए क्लोन किए गए क्षेत्र के तालिका नाम को बदलता है।

कृपया ध्यान दें कि न केवल मूल नमूना उपयोग नहीं किया गया है, बल्कि उस नमूना के लिए तालिकाओं को मेटाडेटा से भी हटा दिया गया है।

1
2
3
2.ormar_config ado.keys ()
dict_keys (['test_date_models', 'श्रेणियां', 'विषय', 'व्यक्ति', 'ट्रक', 'बस',
           cars_x_persons_truks2 ', 'trucks2', 'cars_x_persons_buses2', 'buses2'])

इसलिए, कृपया ध्यान दें कि यदि आप रास्ते में विरासत का परिचय देते हैं और नमूना को एक अमूर्त माता-पिता नमूना में बदलते हैं, तो यदि आप सावधान नहीं हैं तो आप तालिका में डेटा खो सकते हैं।

!!!ध्यान दें कि मूल तालिका नाम और नमूना थ्रू नमूना का नाम कभी उपयोग नहीं किया जाता है। केवल क्लोन नमूना तालिकाएँ बनाई और उपयोग की जाती हैं।

!!!चेतावनी: ध्यान दें कि नमूना का प्रत्येक उपवर्ग जो MToसंबंध को परिभाषित करता है, एक नया थ्रू नमूना उत्पन्न करता है, जो एक नया डेटाबेस और तालिका भी माध्य है।

1
2
यह माध्य है कि हर बार जब आप एक चाइल्ड को परिभाषित करते नमूना आपको मैन्युअल रूप से बनाने की आवश्यकता होती है
डेटाबेस में तालिका, या माइग्रेशन चलाएं (with alembic).

मूल क्षेत्र को छोड़कर

ormar आपको विरासत में मिली नमूना नमूना में माता-पिता से कुछ क्षेत्रों को छोड़ने की अनुमति देता है।

!!!ध्यान दें कि नमूना को अधिक अमूर्त मॉडल और मिश्रण में विभाजित करके एक ही व्यवहार प्राप्त किया जा सकता है - यह सामान्य परिस्थितियों में पसंदीदा दृष्टिकोण है।

सबमॉडल में कुछ फ़ील्ड छोड़ने के लिए, उन सभी फ़ील्ड को सूचीबद्ध करें जिन्हें आप छोड़ना चाहते हैं model.ormar_config.exclude_parent_fields पैरामीटर इस प्रकार हैं:

 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
33
34
35
36
37
आधार _ ormar _ config = marConfig (
    मेटाडेटा = सा। मेटाडेटा (),
    डेटाबेस = डेटाबेस। डेटाबेस (DATABASE_URL),
)


क्लास ऑडिटमॉडल (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    created_by: str = ormar। स्ट्रिंग (max_length = 100)
    updated_by: str = ormar। स्ट्रिंग (max_length = 100, डिफ़ॉल्ट = "Sam")


कक्षा Dateelds (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    बनाया गया तारीख: date.datetime = ormar। दिनांक समय (
        डिफ़ॉल्ट = datetime.datetime.now नाम = "creation_date"
    )
    updated_date: date.datetime = ormar। दिनांक समय (
        डिफ़ॉल्ट = datetime.datetime.now नाम = "संशोधन _ तारीख"
    )


कक्षा श्रेणी (DateFieldsModel, AuditModel):
    ormar _ config = आधार _ ormar _ config कॉपी (
        टेबलनाम = "श्रेणियां",
        # सेट फ़ील्ड जिन्हें छोड़ दिया जाना चाहिए
        _ माता-पिता _ फ़ील्ड = ["updated_by", "updated_date"],
    )

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 50, अद्वितीय = True, सूचकांक = True)
    कोड: int = ormar। पूर्णांक ()

# ध्यान दें कि अब श्रेणियों में अद्यतन फ़ील्ड सभी स्थानों पर चले गए हैं -> ormar फ़ील्ड, pydफ़ील्ड और sqlachतालिका कॉलम
# श्रेणी में उपलब्ध फ़ील्ड की पूरी सूची है: ["created_by", "created_date", "आईडी", "नाम", "कोड"]

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

!!!ध्यान दें कि यदि आप सबमॉडल में किसी फ़ील्ड को अधिलेखित करना चाहते हैं, तो आपको इसे बाहर करने की आवश्यकता नहीं है, बस उसी फ़ील्ड नाम के साथ सबमॉडल में फ़ील्ड घोषणा को अधिलेखित करें।

चेतावनी: यह व्यवहार खस्ता और स्थिर प्रकार के चेकर्स को भ्रमित कर सकता है, लेकिन गैर-मौजूद फ़ील्ड तक पहुंचना रनटाइम पर विफल हो जाएगा। यही कारण है कि बेस क्लास को विभाजित करना पसंद किया जाता है।

उदाहरण के लिए, आधार वर्ग को विभाजित करके समान प्रभाव प्राप्त किया जा सकता है:

 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
33
34
35
36
37
38
आधार _ ormar _ config = marConfig (
    मेटाडेटा = सा। मेटाडेटा (),
    डेटाबेस = डेटाबेस। डेटाबेस (DATABASE_URL),
)


क्लास ऑडिटक्रिटमॉडल (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    created_by: str = ormar। स्ट्रिंग (max_length = 100)


क्लास ऑडिटअपडेटमॉडल (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    updated_by: str = ormar। स्ट्रिंग (max_length = 100, डिफ़ॉल्ट = "Sam")

कक्षा CreateDateFieldsModel (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    बनाया गया तारीख: date.datetime = ormar। दिनांक समय (
        डिफ़ॉल्ट = datetime.datetime.now नाम = "creation_date"
    )

कक्षा UpdateDateFieldsModel (ormar. Model):
    ormar_config = आधार_ormar_config (abstract = True)

    updated_date: date.datetime = ormar। दिनांक समय (
        डिफ़ॉल्ट = datetime.datetime.now नाम = "संशोधन _ तारीख"
    )


कक्षा श्रेणी CreateDateFieldsModel
    ormar_config = base_ormar_config (टेबलनाम = "श्रेणियाँ")

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 50, अद्वितीय = True, सूचकांक = True)
    कोड: int = ormar। पूर्णांक ()

इस तरह, यदि आवश्यक हो, तो आप बनाए गए वर्ग और अद्यतन वर्ग से विरासत में प्राप्त कर सकते हैं, अन्यथा केवल एक वर्ग विरासत में मिल सकता है।