জ্যাঙ্গোর মেটা ক্লাস কীভাবে কাজ করে?


189

আমি জ্যাঙ্গো ব্যবহার করছি যা লোকেরা ব্যবহার করে একটি শ্রেণিতে অতিরিক্ত পরামিতি যুক্ত করতে দেয় class Meta

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

পাইথনের ডকুমেন্টেশনে কেবলমাত্র আমি খুঁজে পেলাম:

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

যাইহোক, আমি মনে করি না এটি একই জিনিস।


6
শিরোনাম পাইথন মেটা সম্পর্কে জিজ্ঞাসা করে তবে জ্যাঙ্গো মেটা সম্পর্কে প্রশ্ন জিজ্ঞাসা করা হচ্ছে - আপনি কোনটি সম্পর্কে জিজ্ঞাসা করছেন?
ckhan

10
@ তবুও তিনি একটি নেস্টেড ক্লাসকে "মেটা" ডাকার অযৌক্তিক সিদ্ধান্তের (আইএমও) কারণে বিভ্রান্ত হয়ে পড়েছেন, যা অত্যন্ত বিভ্রান্তিকর; নতুনদের জন্য, পাইথন এর metaclasses সম্পর্কে, এবং আরও অভিজ্ঞ ব্যবহারকারীদের যে এটা দেখেননি, তার উদ্দেশ্য সম্পর্কে করার জন্য একটি অবরোহী (পরিবর্তে বর্গ বৈশিষ্ট্যাবলী বা বাস্তব metaclasses ব্যবহারের)
জেসি Rocamonde

উত্তর:


231

আপনি দুটি ভিন্ন বিষয় সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করছেন:

  1. Metaজ্যাঙ্গো মডেলগুলির অভ্যন্তর শ্রেণি :

    এটি মডেলের সাথে সংযুক্ত কিছু বিকল্প (মেটাডেটা) সহ কেবল একটি শ্রেণীর ধারক। এটি উপলভ্য অনুমতি, সম্পর্কিত ডেটাবেস টেবিলের নাম, মডেলটি বিমূর্ত কিনা, নামের একক এবং বহুবচন সংস্করণ ইত্যাদির মতো বিষয়গুলি সংজ্ঞায়িত করে

    সংক্ষিপ্ত ব্যাখ্যাটি এখানে: জ্যাঙ্গো ডক্স: মডেলগুলি: মেটা বিকল্পগুলি

    উপলভ্য মেটা বিকল্পগুলির তালিকা এখানে: জ্যাঙ্গো ডক্স: মডেল মেটা বিকল্পসমূহ

    জ্যাঙ্গোর সর্বশেষ সংস্করণের জন্য: জ্যাঙ্গো ডক্স: মডেল মেটা বিকল্পসমূহ

  2. পাইথনে মেটাক্লাস :

    সর্বোত্তম বিবরণটি এখানে: পাইথনে মেটাক্লাসগুলি কী কী?


3
এই দুটি জিনিস কি আদৌ সম্পর্কিত? অর্থাত, জ্যাঙ্গোর Metaঅভ্যন্তর শ্রেণিটি কি আপনাকে পাইথনের বিল্টিন মেটাক্লাস বৈশিষ্ট্যগুলি ব্যবহার করতে বাধা দেয়?
nnyby

10
@ ন্যানিবি: এই দুটি ধারণার মধ্যে দুটি জিনিসই সম্পর্ক তৈরি করে: অনেক ব্যবহারকারীদের নাম এবং বিভ্রান্তি (যেমন ওপির মূল প্রশ্নে এটি ছিল)। আমি বিশ্বাস করি যে সাধারণ বিভ্রান্তি দূর করা এই টোপির উল্লেখযোগ্য সুবিধা। আপনি একমত না?
টেডেক

49

উপরের টেডেকের জ্যাঙ্গো উত্তরটি প্রসারিত করে, জ্যাঙ্গোতে 'ক্লাস মেটা:' ব্যবহারটিও পাইথন খুব সাধারণ is

অভ্যন্তরীণ বর্গ হ'ল শ্রেণীর উদাহরণগুলির মধ্যে ভাগ করা তথ্যের জন্য একটি সুবিধাজনক নেমস্পেস (অতএব 'মেটাডাটা' এর জন্য মেটা নাম তবে আপনি এটি পছন্দ মতো কিছু বলতে পারেন)। জাজানোতে সাধারণত এটি কেবল পঠনযোগ্য কনফিগারেশন স্টাফ থাকে, আপনাকে এটি পরিবর্তন করা বন্ধ করার মতো কিছুই নেই:

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

আপনি এটি সরাসরি জ্যাঙ্গোতেও ঘুরে দেখতে পারেন যেমন:

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>}

যাইহোক, জ্যাঙ্গো আপনাকে আরও অন্বেষণ করতে চান করার সম্ভাবনা বেশি _metaঅ্যাট্রিবিউট যা হয় Optionsমডেল দ্বারা নির্মিত বস্তু metaclassযখন একটি মডেল তৈরি করা হয়। সেখানেই আপনি জাজানো ক্লাসের সমস্ত 'মেটা' তথ্য পাবেন। জ্যাঙ্গোতে, Metaকেবলমাত্র _meta Optionsঅবজেক্টটি তৈরির প্রক্রিয়াটিতে তথ্য পাস করার জন্য ব্যবহৃত হয় ।


এটি ব্যবহারকারীর সংজ্ঞায়িত মডেলগুলিতে কাজ করে না: >>> myapp.models থেকে MyModel আমদানি করে >>> MyModel.Meta Traceback (সর্বশেষতম কলটি শেষ হয়েছে): ফাইল "<console>", লাইন 1, <মডুল> অ্যাট্রিবিউটারে: টাইপ অবজেক্ট 'মাইমোডেল'র কোনও' মেটা 'নেই
বিডিএফ

2
আপনার আন্ডারস্কোর যেমনMyUser.objects.get(pk=1)._meta
পল হিপ্প

ঠিক আছে, তবে এটি মডেলের শ্রেণীর অভ্যন্তরীণ মেটা ক্লাস অ্যাক্সেস করে না। এটি সেই মডেলের দৃষ্টান্তের জন্য _মেটা বিকল্পগুলি অ্যাক্সেস করে ... অভ্যন্তরীণ মেটা বর্গ নিজেই অ্যাক্সেস করার কোনও উপায় বলে মনে হয় না। আমার জন্য ব্যবহারের ক্ষেত্রে মাইমোডেল থেকে প্রক্সি মাইমোডেলপ্রক্সি ক্লাসটি এমনভাবে সাবক্লাসিং করা হয়েছিল যেখানে মাইমোডেলপ্রক্সি মাইমোডেলের অভ্যন্তরীণ মেটা শ্রেণীর উত্তরাধিকারী হতে পারে।
বিডিএফ

আপনি মডেলটির 'অভ্যন্তরীণ মেটা ক্লাস' বলতে কী বোঝায় সে সম্পর্কে আমি পুরোপুরি পরিষ্কার নই তবে আপনি সর্বদা উদাহরণের ক্লাসের সাথে সরাসরি কাজ করতে পারেন যেমনtype(MyUser.objects.get(pk=1)).Meta
পল হিপ্প

3
"শ্রেণীর উদাহরণগুলির মধ্যে ভাগ করা ডেটার জন্য সুবিধাজনক নেমস্পেস" এই লাইনটি এটি আমার জন্য করেছিল।
এমজিপি

22

জ্যাঙ্গোর Modelক্লাসটি বিশেষত Metaএকটি শ্রেণীর নামযুক্ত একটি বৈশিষ্ট্যযুক্ত পরিচালনা করে । এটি একটি সাধারণ পাইথন জিনিস নয়।

পাইথন মেটাক্লাসগুলি সম্পূর্ণ আলাদা।


12
আমি মনে করি আপনার উত্তরটি যথেষ্ট পরিষ্কার নয় - আপনি Metaশ্রেণি কীভাবে কাজ করে তা বিস্তারিতভাবে বলতে পারেন ? আমি বিশ্বাস করি ওপি বিশেষত সে সম্পর্কে জিজ্ঞাসা করেছিল।
টেডেক

7

জ্যাঙ্গো মডেল Metaএবং মেটাচ্লাসগুলি "সম্পূর্ণ আলাদা" দাবি করে এমন উত্তরগুলি বিভ্রান্তিমূলক উত্তর are

জ্যাঙ্গো মডেল শ্রেণীর অবজেক্টের নির্মাণ (যেটি শ্রেণীর সংজ্ঞা নিজেই বোঝায় এমন বস্তুটি বলতে বোঝায়; হ্যাঁ, শ্রেণিগুলিও বস্তুগুলি) প্রকৃতপক্ষে একটি মেটাক্লাস নামে পরিচিত ModelBaseযা আপনি এখানে কোড দেখতে পারেন:

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

এবং এর মধ্যে অন্যতম কাজ ModelBaseহ'ল _metaপ্রতিটি জ্যাঙ্গো মডেলের বৈশিষ্ট্য তৈরি করা যার মধ্যে বৈধতা সরঞ্জাম, ক্ষেত্রের বিশদ, যুক্তি সংরক্ষণ এবং আরও অনেক কিছু রয়েছে। এই অপারেশনের সময়, মডেলের অভ্যন্তর Metaশ্রেণিতে নির্দিষ্ট করা জিনিসগুলি সেই প্রক্রিয়াটির মধ্যে পড়ে এবং ব্যবহৃত হয়।

হ্যাঁ, যদিও হ্যাঁ, এক অর্থে Metaএবং মেটাক্লাসগুলি পৃথক 'জিনিস', জাজানো মডেল নির্মাণের যান্ত্রিকগুলির মধ্যে তারা নিবিড়ভাবে সম্পর্কিত; তারা কীভাবে একসাথে কাজ করে তা বোঝার সাথে সাথে উভয়ের মধ্যে আপনার অন্তর্দৃষ্টি আরও গভীর হবে।

জ্যাঙ্গো মডেল কীভাবে মেটাচ্লাস নিয়োগ করে তা আরও ভালভাবে বুঝতে এই তথ্যের সহায়ক উত্স হতে পারে।

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

এবং আপনি যদি বস্তুগুলি সাধারণভাবে কীভাবে কাজ করেন তা আরও ভালভাবে বুঝতে চাইলে এটিও সহায়তা করতে পারে।

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


0

ইনার মেটা ক্লাস ডকুমেন্ট জ্যাঙ্গো মডেল মেটাডেটার এই ডকুমেন্টটি হ'ল ক্ষেত্র নয় এমন কিছু, যেমন অর্ডার অপশন (অর্ডারিং), ডাটাবেস টেবিলের নাম (ডিবি_ টেবিল), বা মানব-পঠনযোগ্য একক এবং বহুবচনীয় নাম (ভার্বোস_নেম এবং ভার্বোস_নেম_প্লারাল)। কোনওটির প্রয়োজন নেই, এবং কোনও মডেলটিতে ক্লাস মেটা যুক্ত করা সম্পূর্ণরূপে alচ্ছিক। https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options


0

জ্যাঙ্গোতে এটি একটি কনফিগারেশন ক্লাস হিসাবে কাজ করে এবং কনফিগারেশন ডেটা এক জায়গায় রাখে !!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.