django - يقع - خريطة حقول النفط في كردستان




دجانجو: احصل على قائمة حقول النموذج؟ (6)

أجد أن إضافة هذا إلى نماذج django مفيدة للغاية:

def __iter__(self):
    for field_name in self._meta.get_all_field_names():
        value = getattr(self, field_name, None)
        yield (field_name, value)

هذا يتيح لك القيام بما يلي:

for field, val in object:
    print field, val

قمت بتعريف فئة User التي (في النهاية) يرث من models.Model . أرغب في الحصول على قائمة بجميع الحقول المحددة لهذا النموذج. على سبيل المثال ، phone_number = CharField(max_length=20) . في الأساس ، أرغب في استرداد أي شيء يرث من فئة Field .

ظننت أنني inspect.getmembers(model) استردادها من خلال الاستفادة من inspect.getmembers(model) ، ولكن القائمة التي inspect.getmembers(model) لا تحتوي على أي من هذه الحقول. يبدو أن دجانغو قد حصل بالفعل على حصة من الصف وأضف كل صفاته السحرية وجرد ما تم تعريفه بالفعل. إذن ... كيف يمكنني الحصول على هذه الحقول؟ ربما لديهم وظيفة لاسترجاعها لأغراضهم الداخلية الخاصة؟


بالنسبة إلى إصدارات Django 1.8 والإصدارات الأحدث:

تم get_all_field_names() طريقة get_all_field_names() بدءًا من Django 1.8 وستتم إزالتها في 1.10 .

توفر صفحة الوثائق المرتبطة أعلاه تنفيذًا متوافقاً بشكل كامل مع get_all_field_names() ، ولكن لمعظم الأغراض [f.name for f in MyModel._meta.get_fields()] يجب أن تعمل بشكل جيد.

لإصدارات Django قبل 1.8:

model._meta.get_all_field_names()

الذي عليه أن يقوم بالخدعة.

يتطلب ذلك نسخة نموذج فعلية. إذا كان كل ما لديك هو فئة فرعية من django.db.models.Model ، فعليك الاتصال بـ myproject.myapp.models.MyModel._meta.get_all_field_names()


على الأقل مع Django 1.9.9 - الإصدار الذي أستخدمه حاليًا - لاحظ أن .get_fields() الواقع أيضًا "يعتبر" أي نموذج أجنبي كحقل ، والذي قد يكون مشكلة. قل لديك:

class Parent(models.Model):
    id = UUIDField(primary_key=True)

class Child(models.Model):
    parent = models.ForeignKey(Parent)

إنه يتبع هذا

>>> map(lambda field:field.name, Parent._model._meta.get_fields())
['id', 'child']

بينما ، كما هو موضح فيRockallite

>>> map(lambda field:field.name, Parent._model._meta.local_fields)
['id']

فقط للإضافة ، أنا أستخدم كائن النفس ، وهذا عمل بالنسبة لي:

[f.name for f in self.model._meta.get_fields()]

هذا لا الحيلة. أنا اختبار فقط في دجانجو 1.7.

your_fields = YourModel._meta.local_fields
your_field_names = [f.name for f in your_fields]

لا يحتوي Model._meta.local_fields . يجب عليك الحصول عليها باستخدام Model._meta.local_many_to_many .


MyModel._meta.get_all_field_names() تم إيقافه عدة إصدارات وإزالته في Django 1.10.

إليك اقتراح متوافق مع الإصدارات السابقة من المستندات :

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




django-models