اذهب إلى المحتوى

السؤال

نشر

لقد حددت صنف user التي  ترث من نموذج جانغو models.Model. أريد الحصول على قائمة بجميع الحقول الموجودة لهذا النموذج. على سبيل المثال، يجب أن تحتوي القائمة على الحقول مثل:

phone_number = CharField(max_length = 20)

اعتقدت أنني سأتمكن من استرداد هذه من خلال الاستفادة من الكود التالي:
 

inspect.getmembers(model)

لكن القائمة التي تعيدها لا تحتوي على أي من هذه الحقول. كيف يمكنني الحصول على هذه الحقول؟ هل توجد دالة للحصول على هذه الحقول بطريقة ما؟

Recommended Posts

  • 1
نشر

يمكن عمل ذلك في جانغو Django ولكن تختلف الطريقة حسب الإصدار الذي لديك، فبالنسبة إلى الإصدار 1.8 وما هو أحدث من جانغو Django، يمكنك أن تستخدم التابع get_fields، على النحو التالي:

# نستدعي النموذج هنا
from django.contrib.auth.models import User

[field.name for field in User._meta.get_fields()]

# أو
[field.name for field in User._meta.fields]

بهذه الطريقة سوف تحصل على قائمة بكل الحقول الموجودة في هذا النموذج.

لاحظ أن التابع get_fields سوف يقوم بإرجاع على بعض العلاقات التي لا يمكنك عرضها في view على سبيل المثال.

أما بالنسبة للإصدارات الأقدم من 1.8، فيمكنك أن تستخدم التابع get_all_field_names، على النحو التالي:
 

model._meta.get_all_field_names()

لاحظ أن هذه الدالة لا تعمل إلا في الإصدارات القديمة وأصبحت متجاهلة deprecated، وتم حذفها بداية من الإصدار 1.10

  • 0
نشر

إضافة لما ذكره سامح فإنه في في النسخ الأحدث (2.2) من جانغو يمكنك استخدام BlogPost كالتالي:

# model  من ال
from posts.model import BlogPost as bp
fields = bp._meta.fields
#أو
fields = bp._meta.get_fields()
###############################################
# instance ومن ال
import posts.model.BlogPost
blogpost = BlogPost()
fields = blogpost._meta.fields

 

  • 0
نشر

يمكنك عمل دالة بداخل الدالة لفعل ذلك, وظيفة الدالة أن تحصل على جميع الحقول باستخدام الدالة get_all_field_names ثم عمل حلقة تكرار على جميع الحقول كالتالي

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

أو يمكنك استخدام الطريقة التالية, وهي استخدام __dict__ , الطريقة تعتمد على اذا كنت تستخدم الصنف نفسه أم كائن من الصنف, افترض لدينا الصنف User ,اذا كنت تستخدم كائن منه على سبيل المثال

instance = User.objects.get(username="foo")
instance.__dict__ #يقوم بإرجاع قاموس بكل الحقول وقيمها
instance.__dict__.keys() # يقوم بإرجاع قاموس بجميع الحقول
list(instance.__dict__.keys()) # إرجاع قائمة مع جميع الحقول

أما اذا كنت تستخدم الصنف نفسه,

User._meta.__dict__.get("fields") # إرجاع الحقول

# للحصول على أسماء الحقول ، يمكنك عمل حلقة تكرار واستدعاء __str __ ()
for field in User._meta.__dict__.get("fields"):
    field.__str__()

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...