জ্যাঙ্গোতে মডেলের ক্ষেত্রগুলি পান


121

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

_মেটা কি এই নিয়মের ব্যতিক্রম? এটি কি স্থিতিশীল এবং ব্যবহারের জন্য প্রস্তুত বা এটি অ্যাক্সেস করার জন্য খারাপ অভ্যাস হিসাবে বিবেচিত? বা _meta অ্যাট্রিবিউটটি ব্যবহার না করে কোনও ফাংশন বা কোনও মডেলের ক্ষেত্রগুলিকে অন্তর্নিম্ন করার কোনও উপায় আছে? নীচে কিছু লিঙ্কের একটি তালিকা দেওয়া আছে যা _ মেটা অ্যাট্রিবিউট ব্যবহার করে এটি কীভাবে করবে তা দেখায়

কোন পরামর্শ অনেক প্রশংসা করা হয়।

জ্যাঞ্জো অবজেক্ট গেট / সেট ফিল্ড

http://www.djangofoo.com/80/get-list-model-fields

জঙ্গো মডেল ক্ষেত্রগুলিকে কীভাবে অন্তরীক্ষণ করবেন?


উত্তর:


144

_metaব্যক্তিগত, তবে এটি তুলনামূলকভাবে স্থিতিশীল। এটি আনুষ্ঠানিক করার, এটি নথিভুক্ত করার এবং আন্ডারস্কোরটি সরিয়ে দেওয়ার চেষ্টা রয়েছে, যা 1.3 বা 1.4 এর আগে ঘটতে পারে। আমি ধারণা করি যে জিনিসগুলি পিছনের দিকে সামঞ্জস্যপূর্ণ তা নিশ্চিত করার চেষ্টা করা হবে, কারণ প্রচুর লোক যেভাবেই এটি ব্যবহার করছে using

আপনি যদি সামঞ্জস্যতা সম্পর্কে বিশেষত উদ্বিগ্ন হন তবে একটি ফাংশন লিখুন যা একটি মডেল নেয় এবং ক্ষেত্রগুলি ফেরত দেয়। এর অর্থ ভবিষ্যতে যদি কিছু পরিবর্তন হয় তবে আপনাকে কেবল একটি ফাংশন পরিবর্তন করতে হবে।

def get_model_fields(model):
    return model._meta.fields

আমি বিশ্বাস করি এটি Fieldবস্তুর একটি তালিকা ফিরিয়ে দেবে । উদাহরণ থেকে প্রতিটি ক্ষেত্রের মান পেতে, ব্যবহার করুন getattr(instance, field.name)

আপডেট: জাজানো অবদানকারীরা একটি গুগল সামার কোডের অংশ হিসাবে _ মেটা অবজেক্টটি প্রতিস্থাপন করতে একটি API এ কাজ করছেন। দেখুন:
- https://groups.google.com/forum/#!topic/django-developers/hD4roZq0wyk
- https://code.djangoproject.com/wiki/new_meta_api


45
তাঁর বাস্তব সম্পর্কে আপনারও সচেতন হওয়া উচিত, আপনার যদি খুব বেশি ক্ষেত্রের অ্যাক্সেসের প্রয়োজন হয় তবে model._meta.many_to_many!
বার্নহার্ড ভালান্ট

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

3
django/core/management/commands/loaddata.pyঅ্যাপ্লিকেশন, মডেল এবং ক্ষেত্রের গাছ হাঁটার জন্য _মেটা ব্যবহার করে। অনুসরণ করার জন্য দুর্দান্ত প্যাটার্ন ... এবং আপনি এটি "অফিসিয়াল উপায়" বাজি ধরতে পারেন।
হোবস

2
আপনি যদি জেনেরিক বিদেশী কী ব্যবহার করছেন তবে _meta.virtual_fields
আপনারও


97

আমি জানি এই পোস্টটি বেশ পুরানো, তবে আমি যে কাউকে একই জিনিসটি অনুসন্ধান করার জন্য এটি করার জন্য একটি সরকারী এবং অফিসিয়াল এপিআই রয়েছে তা কেবল বলেছি: get_fields()এবংget_field()

ব্যবহার:

fields = model._meta.get_fields()
my_field = model._meta.get_field('my_field')

https://docs.djangoproject.com/en/1.8/ref/models/meta/


6
এটি আসলে জাঙ্গোর নতুন সংস্করণটির সঠিক উত্তর।
ছন্তিয়াল


3
একটি প্রশ্ন: এগুলি যদি "পাবলিক এবং অফিসিয়াল" হয় তবে এগুলি এখনও কেন চলছে _meta?
ক্রুবো

9

এখন বিশেষ পদ্ধতি রয়েছে - get_fields ()

    >>> from django.contrib.auth.models import User
    >>> User._meta.get_fields()

এটি দুটি পরামিতি গ্রহণ করে যা কোন ক্ষেত্রগুলি ফিরে আসবে তা নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে:

  • include_parents

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

  • include_hidden

    ডিফল্ট হিসাবে মিথ্যা। যদি সত্যতে সেট করা থাকে, get_fields () এর মধ্যে এমন ক্ষেত্রগুলি অন্তর্ভুক্ত থাকবে যা অন্য ক্ষেত্রের কার্যকারিতা ব্যাক করতে ব্যবহৃত হয়। এটিতে এমন একটি ক্ষেত্রও অন্তর্ভুক্ত থাকবে যার সাথে সম্পর্কিত_নাম রয়েছে (যেমন ম্যান্টটোম্যানিফিল্ড, বা ফরেনকে) যা "+" দিয়ে শুরু হয়


9

get_fields()একটি প্রদান করে tupleএবং প্রতিটি উপাদান একটি Model fieldপ্রকার, যা সরাসরি স্ট্রিং হিসাবে ব্যবহার করা যায় না। সুতরাং, field.nameক্ষেত্রের নাম ফিরে আসবে

my_model_fields = [field.name for field in MyModel._meta.get_fields()]
উপরের কোডটি সমস্ত ক্ষেত্রের নাম উদাহরণের সাথে মিল রেখে একটি তালিকা ফিরে আসবে


In [11]: from django.contrib.auth.models import User

In [12]: User._meta.get_fields()
Out[12]: 
(<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>)

In [13]: [field.name for field in User._meta.get_fields()]
Out[13]: 
['logentry',
 'id',
 'password',
 'last_login',
 'is_superuser',
 'username',
 'first_name',
 'last_name',
 'email',
 'is_staff',
 'is_active',
 'date_joined',
 'groups',
 'user_permissions']

দুর্দান্ত উত্তর! ধন্যবাদ!
Tms91

8

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

opts = model._meta
for f in sorted(opts.fields + opts.many_to_many):
    print '%s: %s' % (f.name, f)

4

_মেটা অন্তর্ভুক্ত মডেল ক্ষেত্রগুলি সংশ্লিষ্ট ক্ষেত্রের সামগ্রীর তালিকা হিসাবে একাধিক স্থানে তালিকাভুক্ত হয়। তাদের সাথে অভিধান হিসাবে কাজ করা আরও সহজ হতে পারে যেখানে কীগুলি ক্ষেত্রের নাম।

আমার মতে, এটি মডেল ক্ষেত্রের বিষয়গুলি সংগ্রহ এবং সংগঠিত করার জন্য সবচেয়ে অযৌক্তিক এবং অভিব্যক্তিক উপায়:

def get_model_fields(model):
  fields = {}
  options = model._meta
  for field in sorted(options.concrete_fields + options.many_to_many + options.virtual_fields):
    fields[field.name] = field
  return fields

( Django.forms.models.fields_for_model এ উদাহরণ ব্যবহার দেখুন See )


2
আপনার কোডটি এটি কী করছে তার সংক্ষিপ্ত বিবরণ সহ আপনি যেতে চাইবেন।
বাস ভ্যান ডিজক

2

এটা কেমন.

fields = Model._meta.fields

1
আমি কল্পনা করি যে কেউ একটি ক্ষেত্রের বৈশিষ্ট্য অ্যাক্সেস করতে পারে। পূর্ববর্তী উত্তরে যেমন উল্লেখ করা হয়েছে, তেমন রয়েছে many_to_manyএবং রয়েছে virtual_fields
জোকে

@ জোক ঠিক আছে আপনি আরেকটি বৈশিষ্ট্য অ্যাক্সেস করার জন্য প্রয়োজন দেখা দিতে পারে। উত্তর সম্পাদিত।
JDE876

2

জ্যাঙ্গো ডকুমেন্টেশন ২.২ অনুসারে আপনি ব্যবহার করতে পারেন:

সমস্ত ক্ষেত্র পেতে: Model._meta.get_fields()

একটি পৃথক ক্ষেত্র পেতে: Model._meta.get_field('field name')

প্রাক্তন। Session._meta.get_field('expire_date')


1

আপনার অ্যাডমিন সাইটের জন্য যদি আপনার এটির প্রয়োজন হয় তবে সেই ModelAdmin.get_fieldsপদ্ধতি ( ডক্স )ও রয়েছে যা listক্ষেত্রের একটি নাম দেয় strings

উদাহরণ স্বরূপ:

class MyModelAdmin(admin.ModelAdmin):
    # extending change_view, just as an example
    def change_view(self, request, object_id=None, form_url='', extra_context=None):
        # get the model field names
        field_names = self.get_fields(request)
        # use the field names
        ...

0

আরেকটি উপায় হ'ল মডেলটিতে ফাংশন যুক্ত করা এবং আপনি যখন তারিখটিকে ওভাররাইড করতে চান তখন ফাংশনটি কল করতে পারেন।

class MyModel(models.Model):
    name = models.CharField(max_length=256)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def set_created_date(self, created_date):
        field = self._meta.get_field('created')
        field.auto_now_add = False
        self.created = created_date

    def set_modified_date(self, modified_date):
        field = self._meta.get_field('modified')
        field.auto_now = False
        self.modified = modified_date

my_model = MyModel(name='test')
my_model.set_modified_date(new_date)
my_model.set_created_date(new_date)
my_model.save()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.