سؤال

بدون وجود مسار الوحدة الكامل لنموذج Django، هل من الممكن القيام بشيء مثل:

model = 'User' [in Django namespace]
model.objects.all()

...في مقابل:

User.objects.all().

يحرر:أحاول إجراء هذه المكالمة بناءً على إدخال سطر الأوامر.هل من الممكن تجنب بيان الاستيراد، على سبيل المثال،

model = django.authx.models.User

بدون إرجاع Django للخطأ:

"global name django is not defined."
هل كانت مفيدة؟

المحلول

أعتقد أنك تبحث عن هذا:

from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')

هناك طرق أخرى بالطبع، ولكن هذه هي الطريقة التي سأتعامل بها إذا كنت لا تعرف ملف النماذج الذي تحتاج إلى استيراده إلى مساحة الاسم الخاصة بك.(لاحظ أنه لا توجد طريقة للحصول على نموذج بأمان دون معرفة التطبيق الذي ينتمي إليه أولاً.انظر إلى الكود المصدري لـ upload.py إذا كنت تريد اختبار حظك في التكرار على جميع نماذج التطبيقات.)

التحديث لجانغو 1.7+: وفقا لجانغو الجدول الزمني للإهمال, django.db.models.loading تم إهماله في Django 1.7 وستتم إزالته في Django 1.9.كما أشار في إجابة الاسدير, ، في Django 1.7+ ، هناك سجل التطبيقات.يمكنك استخدام ال apps.get_model طريقة الحصول على النموذج ديناميكيًا:

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')

نصائح أخرى

لجانغو 1.7+، هناك التسجيل . يمكنك استخدام apps.get_model طريقة لحيوي الحصول على نموذج.

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
from django.authx.models import User
model = User
model.objects.all()
<اقتباس فقرة>   

ونموذج = django.authx.models.User

     

و؟ جانغو بإرجاع خطأ "العالمية   لم يتم تعريف اسم جانغو ".

وجانغو لا يقوم بإرجاع الخطأ. الثعبان لا.

أولا، يجب أن استيراد النموذج. يجب استيراده مع

from django.authx.models import User

وثانيا، إذا كنت تحصل على خطأ لم يتم تعريف django، ثم لم يتم تثبيت جانغو بشكل صحيح. يجب أن يكون جانغو على PYTHONPATH أو المثبتة في الخاص بيثون ليب / موقع حزم.

لتثبيت جانغو بشكل صحيح، انظر HTTP: // مستندات. djangoproject.com/en/dev/intro/install/#intro-install

وفئات هي كائنات "الدرجة الأولى" في بيثون، وهذا يعني أنها يمكن أن تنتقل حول والتلاعب تماما مثل كافة الكائنات الأخرى.

والنماذج هي الطبقات - يمكن أن أقول لكم من حقيقة أن إنشاء نماذج جديدة باستخدام عبارات الصف:

class Person(models.Model):
    last_name = models.CharField(max_length=64)

class AnthropomorphicBear(models.Model):
    last_name = models.CharField(max_length=64)

وكلاهما لا بد معرفات Person وAnthropomorphicBear إلى الطبقات جانغو، حتى تتمكن من تمرير حول لهم. هذا يمكن مفيدا إذا كنت ترغب في إنشاء وظائف المساعد التي تعمل على مستوى النموذج (وتشترك في واجهة مشتركة):

def print_obj_by_last_name(model, last_name):
    model_name = model.__name__
    matches = model.objects.filter(last_name=last_name).all()
    print('{0}: {1!r}'.format(model_name, matches))

وهكذا print_obj_by_last_name ستعمل مع إما Person أو نماذج AnthropomorphicBear. يمر هذا النموذج في مثل ذلك:

print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')

إذا كان لديك اسم النموذج مرت كسلسلة أعتقد طريقة واحدة يمكن أن تكون

modelname = "User"
model = globals()[modelname]

ولكن التلويث حول مع غلوبالس () قد يكون خطرا قليلا في بعض السياقات. لذلك التعامل مع الرعاية:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top