Django का मेटा क्लास कैसे काम करता है?


189

मैं Django का उपयोग कर रहा हूं जो लोगों को उपयोग करके कक्षा में अतिरिक्त पैरामीटर जोड़ने की अनुमति देता है class Meta

class FooModel(models.Model):
    ...
    class Meta:
        ...

केवल एक चीज जो मुझे पायथन के दस्तावेज में मिली वह थी:

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

हालाँकि, मुझे नहीं लगता कि यह वही बात है।


6
शीर्षक पायथन मेटा के बारे में पूछता है, लेकिन सवाल Django मेटा के बारे में पूछना लगता है - आप किसके बारे में पूछ रहे हैं?
ckhan

10
@ckhan वह एक नेस्टेड क्लास "मेटा" को कॉल करने के बेतुके फैसले (IMO) के कारण भ्रमित है, जो बहुत भ्रामक है; शुरुआती लोगों के बारे में, पायथन के मेटासेल्स के बारे में, और अधिक अनुभवी उपयोगकर्ताओं के लिए, जिन्होंने इसे कभी नहीं देखा है, इसके उद्देश्य के बारे में एक प्राथमिकताओं (वर्ग विशेषताओं या वास्तविक
मेटाक्लासेस

जवाबों:


231

आप दो अलग चीजों के बारे में एक सवाल पूछ रहे हैं:

  1. MetaDjango मॉडल में आंतरिक वर्ग :

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

    संक्षिप्त विवरण यहाँ है: Django डॉक्स: मॉडल: मेटा विकल्प

    उपलब्ध मेटा विकल्पों की सूची यहां है: Django डॉक्स: मॉडल मेटा विकल्प

    Django के नवीनतम संस्करण के लिए: Django डॉक्स: मॉडल मेटा विकल्प

  2. पायथन में मेटाक्लास :

    सबसे अच्छा वर्णन यहाँ है: पायथन में मेटाक्लस क्या हैं?


3
क्या ये दो चीजें बिल्कुल संबंधित हैं? अर्थात्, क्या Django की Metaआंतरिक कक्षा आपको पायथन के बिलिन मेटाक्लास सुविधाओं का उपयोग करने से रोकती है?
nnyby

10
@nbyby: इन दो अवधारणाओं के बीच संबंध बनाने वाली दो चीजें हैं: कई उपयोगकर्ताओं के नाम और भ्रम हैं (जैसा कि ओपी के पास मूल प्रश्न में था)। मेरा मानना ​​है कि आम भ्रम इस टोपि का महत्वपूर्ण लाभ है। क्या आप सहमत नहीं हैं?
ताडेक

49

ऊपर टैडेक के Django जवाब पर विस्तार करते हुए, Django में 'वर्ग मेटा:' का उपयोग केवल सामान्य पायथन भी है।

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

In [1]: class Foo(object):
   ...:     class Meta:
   ...:         metaVal = 1
   ...:         
In [2]: f1 = Foo()
In [3]: f2 = Foo()
In [4]: f1.Meta.metaVal
Out[4]: 1
In [5]: f2.Meta.metaVal = 2
In [6]: f1.Meta.metaVal
Out[6]: 2
In [7]: Foo.Meta.metaVal
Out[7]: 2

आप इसे सीधे Django में भी देख सकते हैं जैसे:

In [1]: from django.contrib.auth.models import User
In [2]: User.Meta
Out[2]: django.contrib.auth.models.Meta
In [3]: User.Meta.__dict__
Out[3]: 
{'__doc__': None,
 '__module__': 'django.contrib.auth.models',
 'abstract': False,
 'verbose_name': <django.utils.functional.__proxy__ at 0x26a6610>,
 'verbose_name_plural': <django.utils.functional.__proxy__ at 0x26a6650>}

हालांकि, Django में आप उस _metaविशेषता का पता लगाना चाहते हैं जो Optionsमॉडल द्वारा बनाई गई वस्तु है metaclassजब मॉडल बनाया जाता है। यह वह जगह है जहाँ आप Django वर्ग 'मेटा' जानकारी के सभी मिल जाएगा। Django में, Metaबस _meta Optionsऑब्जेक्ट बनाने की प्रक्रिया में जानकारी पास करने के लिए उपयोग किया जाता है ।


यह उपयोगकर्ता द्वारा परिभाषित मॉडल पर काम नहीं करता है: >> myapp.models से >>> MyModel आयात करें >>> MyModel.Meta Traceback (सबसे हाल ही में कॉल अंतिम): फ़ाइल "<कंसोल>", पंक्ति 1, में <मॉड्यूल> विशेषता गुण: टाइप ऑब्जेक्ट 'MyModel' की कोई विशेषता नहीं है 'मेटा'
bdf

2
आपको अंडरस्कोर की आवश्यकता हैMyUser.objects.get(pk=1)._meta
पॉल व्हिप

सही है, लेकिन यह मॉडल के वर्ग के भीतर मेटा क्लास तक नहीं पहुंचता है। यह उस मॉडल के उदाहरण के लिए _meta विकल्प तक पहुँचता है ... वहाँ आंतरिक मेटा क्लास तक पहुँचने का एक तरीका प्रतीत नहीं होता है। मेरे लिए उपयोग का मामला MyModel से एक प्रॉक्सी MyModelProxy वर्ग को इस तरह से उपवर्गित कर रहा था, जहाँ MyModelProxy, MyModel के आंतरिक मेटा वर्ग को विरासत में दे सकता है।
bdf

मैं इस बात पर पूरी तरह से स्पष्ट नहीं हूं कि आप मॉडल के 'इनर मेटा क्लास' से क्या मतलब रखते हैं, लेकिन आप हमेशा उदाहरण के वर्ग के साथ सीधे काम कर सकते हैं जैसेtype(MyUser.objects.get(pk=1)).Meta
पॉल व्हिप

3
"वर्ग उदाहरणों के बीच साझा डेटा के लिए सुविधाजनक नाम स्थान" यह रेखा मेरे लिए यह किया।
एमजीपी

22

Django की Modelक्लास विशेष रूप से एक विशेषता है जिसे नाम दिया गया है Metaजो एक क्लास है। यह एक सामान्य अजगर बात नहीं है।

पायथन मेटाक्लास पूरी तरह से अलग हैं।


12
मुझे लगता है कि आपका उत्तर पर्याप्त रूप से स्पष्ट नहीं है - क्या आप विस्तार से बता सकते हैं कि Metaकक्षा कैसे काम करती है? मेरा मानना ​​है कि ओपी ने विशेष रूप से उस बारे में पूछा।
तडेक 3

7

जवाब जो दावा करते हैं कि Django मॉडल Metaजोंगो और मेटाक्लासेस "पूरी तरह से अलग" हैं, वे भ्रामक उत्तर हैं।

Django मॉडल क्लास ऑब्जेक्ट्स का निर्माण (जो उस ऑब्जेक्ट को कहने के लिए है जो वर्ग परिभाषा के लिए ही खड़ा है; हाँ, कक्षाएं भी ऑब्जेक्ट हैं) वास्तव में एक मेटाक्लास द्वारा नियंत्रित होते हैं ModelBase, जिसे आप उस कोड को यहां देख सकते हैं:

https://github.com/django/django/blob/master/django/db/models/base.py#L61

और जो कुछ भी ModelBaseहोता है , उनमें से _metaप्रत्येक Django मॉडल पर विशेषता तैयार करना है जिसमें सत्यापन मशीनरी, फ़ील्ड विवरण, तर्क को सहेजना और आगे शामिल हैं। इस ऑपरेशन के दौरान, सामान जो मॉडल के आंतरिक में निर्दिष्ट हैMeta वर्ग उस प्रक्रिया के भीतर पढ़ा और उपयोग किया जाता है।

तो, हाँ, एक अर्थ में Meta और मेटाक्लेसेस अलग-अलग 'चीजें' हैं, जो Django मॉडल निर्माण के यांत्रिकी के भीतर वे संबंधित हैं; यह समझने के लिए कि वे एक साथ कैसे काम करते हैं, आपकी अंतर्दृष्टि को एक साथ दोनों में गहरा कर देगा।

यह बेहतर तरीके से समझने के लिए जानकारी का एक सहायक स्रोत हो सकता है कि कैसे Django मॉडल मेटाक्लासेस को रोजगार देते हैं।

https://code.djangoproject.com/wiki/DevModelCreation

और यह तब भी मदद कर सकता है जब आप बेहतर ढंग से समझना चाहते हैं कि सामान्य रूप से ऑब्जेक्ट कैसे काम करते हैं।

https://docs.python.org/3/reference/datamodel.html


0

इनर मेटा क्लास डॉक्यूमेंट यह दस्तावेज़ दजंगो मॉडल मेटाडेटा "कुछ भी है जो फ़ील्ड नहीं है", जैसे कि ऑर्डरिंग ऑप्शन (ऑर्डरिंग), डेटाबेस टेबल नेम (db_table), या मानव पठनीय एकवचन और बहुवचन नाम (verbose_name और verbose_name_plural)। किसी को भी आवश्यक नहीं है, और एक मॉडल में वर्ग मेटा को जोड़ना पूरी तरह से वैकल्पिक है। https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options


0

Django में, यह कॉन्फ़िगरेशन क्लास के रूप में कार्य करता है और कॉन्फ़िगरेशन डेटा को एक स्थान पर रखता है !!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.