سؤال

لقد بدأت مؤخرًا في تجربة Django لبعض تطبيقات الويب في أوقات فراغي. أثناء تصميم نموذج البيانات لواحد ، صادفت معضلة استخدام الميراث لتحديد مستخدم موقع الويب أو استخدام تقنية تعرف باسم Monkey Planching مع فئة المستخدم التي تم توفيرها بالفعل بواسطة الإطار.

حاولت إضافة حقل عن طريق (بعد تحديد جميع النماذج الخاصة بي وما إلى ذلك. python manage.py validate):

User.add_to_class('location', models.CharField(max_length=250,blank=True))

ونفذ syncdb أمر. ومع ذلك ، ما زلت أحصل على هذا الخطأ

Operationalerror: لا يوجد مثل هذا العمود: Auth_user.location

سواء كنت في عرض المسؤول للموقع أو manage.py shell. يجب أن تكون هناك خطوة إضافية في عداد المفقودين ، ولكن يبدو أن هناك وثائق محدودة على تقنية ترقيع القرد بأكملها. لذلك أطلب منك المساعدة قبل اللجوء إلى الميراث. أي رمز أو نصائح أو مؤشرات إلى وثائق إضافية هي بالطبع موضع ترحيب.

شكرا لك مقدما.

ملاحظة. أنا أدرك أن هذه التقنية قبيحة ، وربما سيئة. ؛)

هل كانت مفيدة؟

المحلول

عند إضافة حقل إلى أي نموذج ، حتى لو قمت بذلك بالطريقة "الرسمية" ، فأنت بحاجة إلى ترحيل قاعدة البيانات - Django لا يفعل ذلك من أجلك. إسقاط الجدول وتشغيله ./manage.py syncdb تكرارا.

قد ترغب في التحقيق في أحد أطر العمل ، مثل south, ، والتي ستدير هذا النوع من الأشياء بالنسبة لك.

نصائح أخرى

هناك بديل لكلا النهجين ، وهو مجرد استخدام نموذج ملف تعريف ذي صلة. يحدث هذا أيضًا ليكون نهجًا موثقًا جيدًا يوصى به للغاية. ربما يكون السبب في أن نهج ADD_TO_CLASS ليس موثقًا جيدًا ، كما لاحظت ، لأنه محبط بشكل صريح (لسبب وجيه).

يستخدم Djangos Framework metaclasses لتهيئة الجداول. هذا يعني أنه لا يمكنك القرد في أعمدة جديدة ، إلا إذا قمت أيضًا بإعادة تخصيص الفصل ، وهو ما لست متأكدًا من أنه ممكن. (من الممكن ان تكون).

يرى الفرق بين عودة الفئة المعدلة واستخدام النوع () لمزيد من المعلومات.

أعتقد أنك قد تواجه مشاكل فيما يتعلق بمكان تعريف monkeypatch الخاص بك. أعتقد أن Django SyncDB يقوم بإنشاء جداول بيانات فقط من تطبيق Auth "النقي" ، لذلك سيكون النموذج الخاص بك بدون "موقع" ، ثم سيبحث موقعك مع التصحيح عن الحقل.

ربما يتم وصف طريقة أقل إيلامًا لإضافة معلومات إضافية إلى ملفات تعريف المستخدمين في مستندات Django.

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