سؤال

لدي تطبيق Django الذي يحتوي على نموذج حساب واحد. نحن نقول هذا أن يكون متعدد الحساب، لذلك سيكون كل نموذج تقريبا ForeignKey(Account).

ما هي أسهل طريقة للتأكد من كل منها Account (كل حساب في المجال الفرعي الخاص به) يمكن أن الوصول فقط إلى بياناتها الخاصة؟ لدينا برامج متوسطة يملأ المجال الفرعي، والحساب الجاري على كل طلب.

يمكننا أن نفعل هذه الطريقة الصعبة، عن طريق إضافة filter(...., account = request.account) في جميع وجهات نظرنا. هذا غير مرغوب فيه كما،

  1. filter(...., account = request.account) سوف تضاف إلى الكل من الاستفسارات، مما يجعل هذا غير جافة، متكررة وغير عرضة للخطأ.
  2. خطر أكبر هو إذا كان هناك عامل تصفية مفقود في أي مكان هو مخاطر أمنية.
هل كانت مفيدة؟

المحلول

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

أنا أيضا لم أتصل بطريقة جيدة لإجراء مدير استعلام يمكن أن يساعد هنا، ولكن قد يكون ذلك ممكنا.

لذلك، أعتقد أن أفضل حل لقاعدة بيانات "متعددة المستأجر" هو فقط للتأكد من تصفية جميع استفساراتك حسب الحساب. يمكنك القيام بذلك مع:

  • تحديث وضع التصحيح الوسيطة مثل الوسيطة: سجل فرز الملكية

  • في الاختبارات الخاصة بك، تحقق من SQL الناتج عن أي اختبارات وتحقق من حقل الحساب في الاستعلام. يمكنك أيضا تضمين بيانات "حساب آخر" في تركيبات الاختبار الخاصة بك أن الاختبار الخاص بك سيتأكد لا تظهر في أي نتائج استعلام.

  • التأكد من فحص جميع الاستفسارات للمرشح أثناء مراجعة التعليمات البرمجية

بالتأكيد ليست جميلة، ولكن أفضل ما كنت قادرا على القيام به بعيدا.

نصائح أخرى

واو، أواجه نفس المشكلة بالضبط. إليك أفضل إجابة حصلت عليها:

Django: كيف يمكن للمرء تنظيم هذا النموذج / المدير الكبير / فوضى التصميم؟

هذه مقتطف قد تضعك في الاتجاه الصحيح. أعتقد أن أذونات مستوى الصف على قائمة ToDo لمدة 1.2 أيضا، وليس بالتأكيد 100٪ على ذلك.

هل هناك بعض السبب الضخم، لماذا لا يمكنك كتابة وظيفة تقوم تلقائيا بإدراج حساب الجلسة تلقائيا في الاستعلام وتأخذ جميع المعلمات الأخرى كحجج؟

هل تستخدم django.contrib.auth?

إذا كنت كذلك، فما عليك سوى حساب ForeignKey(User, unique=true) ونقابق جميع النماذج الخاصة بك في المستخدم

بمعنى آخر. ForeignKey(User)

أيضا، إلقاء نظرة على DJANGO مستندات المصادقة

تعديل: أعتقد أنني أفهم قلقك أفضل قليلا الآن ...

بدلا من القيام بذلك

my_model.objects.filter(user=request.user)

فقط تفعل:

request.user.my_model_set.all()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top