Django 2.1 - Model _meta API

मॉडल _meta एपीआई




django

मॉडल _meta एपीआई

class Options [source]

मॉडल _meta एपीआई Django ORM के मूल में है। यह सिस्टम के अन्य भागों जैसे लुकअप, क्वेरीज़, फॉर्म और एडमिन को प्रत्येक मॉडल की क्षमताओं को समझने में सक्षम बनाता है। एपीआई प्रत्येक मॉडल वर्ग के _meta विशेषता के माध्यम से सुलभ है, जो कि django.db.models.options.Options object का एक उदाहरण है।

इसे प्रदान करने के तरीके:

  • एक मॉडल के सभी क्षेत्र उदाहरणों को पुनः प्राप्त करें
  • नाम से एक मॉडल का एक ही क्षेत्र उदाहरण प्राप्त करें

फील्ड एक्सेस एपीआई

नाम से मॉडल के किसी एक क्षेत्र का उदाहरण प्राप्त करना

Options.get_field(field_name) [source]

किसी फ़ील्ड का नाम दिया गया फ़ील्ड आवृत्ति लौटाता है।

field_name मॉडल पर एक फ़ील्ड का field_name हो सकता है, अमूर्त या विरासत में मिला मॉडल पर एक फ़ील्ड, या किसी अन्य मॉडल पर परिभाषित फ़ील्ड जो मॉडल को इंगित करता है। बाद के मामले में, field_name (वरीयता के क्रम में) related_query_name उपयोगकर्ता द्वारा निर्धारित किया जाएगा, related_name name उपयोगकर्ता द्वारा निर्धारित किया जाता है, या Django द्वारा स्वचालित रूप से उत्पन्न नाम।

Hidden fields को नाम से पुनर्प्राप्त नहीं किया जा सकता है।

यदि दिए गए नाम के साथ एक फ़ील्ड नहीं मिली है तो एक FieldDoesNotExist अपवाद उठाया जाएगा।

>>> from django.contrib.auth.models import User

# A field on the model
>>> User._meta.get_field('username')
<django.db.models.fields.CharField: username>

# A field from another model that has a relation with the current model
>>> User._meta.get_field('logentry')
<ManyToOneRel: admin.logentry>

# A non existent field
>>> User._meta.get_field('does_not_exist')
Traceback (most recent call last):
    ...
FieldDoesNotExist: User has no field named 'does_not_exist'

एक मॉडल के सभी क्षेत्र उदाहरणों को पुनः प्राप्त करना

Options.get_fields(include_parents=True, include_hidden=False) [source]

एक मॉडल से जुड़े फ़ील्ड का एक टपल देता है। get_fields() दो मापदंडों को स्वीकार करता है जिनका उपयोग उन क्षेत्रों को नियंत्रित करने के लिए किया जा सकता है जो वापस आ गए हैं:

include_parents
डिफ़ॉल्ट रूप से True है। पुनरावर्ती में मूल वर्ग पर परिभाषित फ़ील्ड शामिल हैं। यदि False सेट किया जाता है, तो get_fields() केवल वर्तमान मॉडल पर सीधे घोषित किए गए फ़ील्ड get_fields() । ऐसे मॉडल के क्षेत्र जो सीधे तौर पर अमूर्त मॉडल या प्रॉक्सी कक्षाओं से प्राप्त होते हैं, उन्हें स्थानीय माना जाता है, अभिभावक पर नहीं।
include_hidden
डिफ़ॉल्ट रूप से False । यदि यह True सेट है, तो get_fields() में अन्य फ़ील्ड की कार्यक्षमता को वापस करने के लिए उपयोग किए जाने वाले फ़ील्ड शामिल होंगे। इसमें कोई भी फ़ील्ड शामिल होगा जिसमें एक related_name (जैसे कि ManyToManyField , या ForeignKey ) जो "+" से शुरू होता है।
>>> from django.contrib.auth.models import User
>>> User._meta.get_fields()
(<ManyToOneRel: admin.logentry>,
 <django.db.models.fields.AutoField: id>,
 <django.db.models.fields.CharField: password>,
 <django.db.models.fields.DateTimeField: last_login>,
 <django.db.models.fields.BooleanField: is_superuser>,
 <django.db.models.fields.CharField: username>,
 <django.db.models.fields.CharField: first_name>,
 <django.db.models.fields.CharField: last_name>,
 <django.db.models.fields.EmailField: email>,
 <django.db.models.fields.BooleanField: is_staff>,
 <django.db.models.fields.BooleanField: is_active>,
 <django.db.models.fields.DateTimeField: date_joined>,
 <django.db.models.fields.related.ManyToManyField: groups>,
 <django.db.models.fields.related.ManyToManyField: user_permissions>)

# Also include hidden fields.
>>> User._meta.get_fields(include_hidden=True)
(<ManyToOneRel: auth.user_groups>,
 <ManyToOneRel: auth.user_user_permissions>,
 <ManyToOneRel: admin.logentry>,
 <django.db.models.fields.AutoField: id>,
 <django.db.models.fields.CharField: password>,
 <django.db.models.fields.DateTimeField: last_login>,
 <django.db.models.fields.BooleanField: is_superuser>,
 <django.db.models.fields.CharField: username>,
 <django.db.models.fields.CharField: first_name>,
 <django.db.models.fields.CharField: last_name>,
 <django.db.models.fields.EmailField: email>,
 <django.db.models.fields.BooleanField: is_staff>,
 <django.db.models.fields.BooleanField: is_active>,
 <django.db.models.fields.DateTimeField: date_joined>,
 <django.db.models.fields.related.ManyToManyField: groups>,
 <django.db.models.fields.related.ManyToManyField: user_permissions>)

पुराने API से माइग्रेट करना

Model._meta एपीआई ( django.db.models.options.Options वर्ग से) के django.db.models.options.Options भाग के रूप में, कई तरीकों और गुणों को हटा दिया गया है और Django 1.10 में हटा दिया जाएगा।

इन पुराने APIs को या तो दोहराया जा सकता है:

  • Invoke Options.get_field() , या;
  • सभी क्षेत्रों की एक सूची को पुनः प्राप्त करने के लिए Options.get_fields() को आमंत्रित करना और फिर वांछित फ़ील्ड के गुणों का वर्णन (या फिर, _with_model वेरिएंट के मामले में) का वर्णन करने वाले फ़ील्ड विशेषताओं का उपयोग करके इस सूची को फ़िल्टर करना।

हालांकि पुराने तरीकों के कड़ाई से समकक्ष प्रतिस्थापन करना संभव है, लेकिन यह सबसे अच्छा तरीका नहीं हो सकता है। नए API का बेहतर उपयोग करने के लिए किसी भी फ़ील्ड लूप को रिफलेक्टर करने के लिए समय लेना - और संभवतः उन क्षेत्रों को शामिल करें जिन्हें पहले बाहर रखा गया था - लगभग निश्चित रूप से बेहतर कोड में परिणाम होगा।

मान लें कि आपके पास MyModel नाम का एक मॉडल है, तो निम्न कोड को आपके कोड को नए API में बदलने के लिए बनाया जा सकता है:

  • MyModel._meta.get_field(name) बन जाता है:

    f = MyModel._meta.get_field(name)
    

    फिर जांचें कि क्या:

    • f.auto_created == False , क्योंकि नए get_field() API को "रिवर्स" संबंध मिलेंगे, और:
    • f.is_relation and f.related_model is None , क्योंकि नए get_field() API से GenericForeignKey संबंध GenericForeignKey
  • MyModel._meta.get_field_by_name(name) निम्नलिखित प्रतिस्थापनों के साथ इन चार मूल्यों का एक टपल देता है:

    • field MyModel._meta.get_field(name) द्वारा पाया जा सकता है
    • model क्षेत्र पर model विशेषता के माध्यम से पाया जा सकता है।
    • direct द्वारा पाया जा सकता है: not field.auto_created or field.concrete

      auto_created चेक Django द्वारा बनाए गए सभी "फॉरवर्ड" और "रिवर्स" संबंधों को शामिल नहीं करता है, लेकिन इसमें प्रॉक्सी मॉडल पर AutoField और OneToOneField भी शामिल हैं। हम concrete विशेषता का उपयोग करके इन विशेषताओं को फ़िल्टर करने से बचते हैं।

    • many_to_many को क्षेत्र पर many_to_many विशेषता के माध्यम से पाया जा सकता है।
  • MyModel._meta.get_fields_with_model() बन जाता है:

    [
        (f, f.model if f.model != MyModel else None)
        for f in MyModel._meta.get_fields()
        if not f.is_relation
            or f.one_to_one
            or (f.many_to_one and f.related_model)
    ]
    
  • MyModel._meta.get_concrete_fields_with_model() बन जाता है:

    [
        (f, f.model if f.model != MyModel else None)
        for f in MyModel._meta.get_fields()
        if f.concrete and (
            not f.is_relation
            or f.one_to_one
            or (f.many_to_one and f.related_model)
        )
    ]
    
  • MyModel._meta.get_m2m_with_model() बन जाता है:

    [
        (f, f.model if f.model != MyModel else None)
        for f in MyModel._meta.get_fields()
        if f.many_to_many and not f.auto_created
    ]
    
  • MyModel._meta.get_all_related_objects() बन जाता है:

    [
        f for f in MyModel._meta.get_fields()
        if (f.one_to_many or f.one_to_one)
        and f.auto_created and not f.concrete
    ]
    
  • MyModel._meta.get_all_related_objects_with_model() बन जाता है:

    [
        (f, f.model if f.model != MyModel else None)
        for f in MyModel._meta.get_fields()
        if (f.one_to_many or f.one_to_one)
        and f.auto_created and not f.concrete
    ]
    
  • MyModel._meta.get_all_related_many_to_many_objects() बन जाता है:

    [
        f for f in MyModel._meta.get_fields(include_hidden=True)
        if f.many_to_many and f.auto_created
    ]
    
  • MyModel._meta.get_all_related_m2m_objects_with_model() हो जाता है:

    [
        (f, f.model if f.model != MyModel else None)
        for f in MyModel._meta.get_fields(include_hidden=True)
        if f.many_to_many and f.auto_created
    ]
    
  • MyModel._meta.get_all_field_names() बन जाता है:

    from itertools import chain
    list(set(chain.from_iterable(
        (field.name, field.attname) if hasattr(field, 'attname') else (field.name,)
        for field in MyModel._meta.get_fields()
        # For complete backwards compatibility, you may want to exclude
        # GenericForeignKey from the results.
        if not (field.many_to_one and field.related_model is None)
    )))
    

    यह एक 100% पीछे की ओर संगत प्रतिस्थापन प्रदान करता है, यह सुनिश्चित करता है कि दोनों फ़ील्ड नाम और विशेषता नाम ForeignKey s शामिल हैं, लेकिन GenericForeignKey s से जुड़े फ़ील्ड नहीं हैं। एक सरल संस्करण होगा:

    [f.name for f in MyModel._meta.get_fields()]
    

    हालांकि यह 100% पीछे की ओर संगत नहीं है, यह कई स्थितियों में पर्याप्त हो सकता है।