كيفية كتابة طرق عرض ونماذج واستعلامات فعالة في Django

أنا أحب Django. إنه إطار عمل مدروس جيدًا وبديهي مع اسم يمكنني نطقه بصوت عالٍ. يمكنك استخدامه لتدوير مشروع بحجم عطلة نهاية الأسبوع بسرعة ، ويمكنك أيضًا استخدامه لتشغيل تطبيقات الإنتاج الكاملة على نطاق واسع.

لقد قمت بهذين الأمرين ، وعلى مر السنين اكتشفت كيفية استخدام بعض ميزات Django لتحقيق أقصى قدر من الكفاءة. هؤلاء هم:

  • وجهات النظر المستندة إلى الفئة مقابل الوظائف
  • نماذج Django
  • استرجاع الكائنات مع الاستعلامات

لنلقِ نظرة على الكيفية التي تتيح لك هذه الأدوات إنشاء تطبيق Django فائق الأداء الذي يسعد بنائه وصيانته.

وجهات النظر المستندة إلى الفئة مقابل الوظائف

تذكر أن Django هو كل لغة Python تحت الغطاء. عندما يتعلق الأمر بالعروض ، لديك خياران: عرض الوظائف (تسمى أحيانًا "العروض المستندة إلى الوظيفة") ، أو العروض المستندة إلى الفصل.

منذ سنوات عندما أنشأت ApplyByAPI لأول مرة ، كان يتكون في البداية بالكامل من طرق عرض تستند إلى الوظائف. هذه توفر تحكمًا دقيقًا ، وهي جيدة لتنفيذ المنطق المعقد. تمامًا كما هو الحال في دالة Python ، لديك سيطرة كاملة (للأفضل أو للأسوأ) على ما يفعله العرض.

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

في حالة ApplyByAPI ، لم يكن هناك سوى عدد قليل من الأماكن حيث كان هذا المستوى من الوظائف المخصصة ضروريًا حقًا. في كل مكان آخر ، بدأت الآراء القائمة على الوظيفة تجعل حياتي أكثر صعوبة. أصبحت كتابة ما هو في الأساس عرضًا مخصصًا للعمليات الجارية مثل عرض البيانات على صفحة قائمة مملة ومتكررة وعرضة للخطأ.

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

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

class ApplicationsList(ListView): model = Application template_name = "applications.html" 

إنها ثلاثة أسطر. أصبحت بيئة عمل مطوري ، وحياتي أسهل كثيرًا.

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

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

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

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

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

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

نماذج Django

تنظم النماذج المفاهيم المركزية لتطبيق Django للمساعدة في جعلها مرنة وقوية وسهلة العمل معها. إذا تم استخدامها بحكمة ، فإن النماذج هي وسيلة قوية لترتيب بياناتك في مصدر نهائي للحقيقة.

مثل طرق العرض ، يوفر Django بعض أنواع النماذج المضمنة لتسهيل تنفيذ المصادقة الأساسية ، بما في ذلك نماذج المستخدم والإذن. لكل شيء آخر ، يمكنك إنشاء نموذج يعكس مفهومك من خلال الوراثة من فئة النموذج الأصل.

class StaffMember(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) company = models.OneToOneField(Company, on_delete=models.CASCADE) def __str__(self): return self.company.name + " - " + self.user.email 

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

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

يمكن تعريف علاقات قواعد البيانات باستخدام حقل ForeignKey (متعدد إلى واحد) ، أو حقل ManyToManyField (يمنحك ثلاثة تخمينات). إذا لم تكن هذه كافية ، فهناك أيضًا OneToOneField.  

تتيح لك هذه معًا تحديد العلاقات بين نماذجك بمستويات من التعقيد محدودة فقط بخيالك. (اعتمادًا على الخيال الذي لديك ، قد يكون هذا ميزة أو لا).

استرجاع الكائنات مع الاستعلامات

استخدم مدير النموذج الخاص بك ( objectsافتراضيًا) لبناء QuerySet. هذا تمثيل للكائنات في قاعدة البيانات الخاصة بك يمكنك صقلها ، باستخدام الطرق ، لاسترداد مجموعات فرعية محددة. جميع الطرق المتاحة موجودة في QuerySet API ويمكن ربطها ببعضها البعض للحصول على مزيد من المتعة.

Post.objects.filter( type="new" ).exclude( title__startswith="Blockchain" ) 

تقوم بعض الطرق بإرجاع مجموعات QuerySets جديدة ، مثل filter()، أو exclude(). يمكن أن يمنحك تسلسل هذه استعلامات قوية دون التأثير على الأداء ، حيث لا يتم جلب QuerySets من قاعدة البيانات حتى يتم تقييمها. الأساليب التي تشمل تقييم مجموعة طلبات البحث get()، count()، len()، list()، أو bool().

يقوم التكرار عبر QuerySet أيضًا بتقييمه ، لذا تجنب القيام بذلك قدر الإمكان لتحسين أداء الاستعلام. على سبيل المثال ، إذا كنت تريد فقط معرفة ما إذا كان الكائن موجودًا ، فيمكنك استخدامه exists()لتجنب التكرار عبر كائنات قاعدة البيانات.

استخدم get()في الحالات التي تريد فيها استرداد كائن معين. تثير هذه الطريقة MultipleObjectsReturnedإذا حدث شيء غير متوقع ، بالإضافة إلى DoesNotExistالاستثناء ، إذا ، خمن.

إذا كنت ترغب في الحصول على كائن قد لا يكون موجودًا في سياق طلب المستخدم ، فاستخدم الأمر المناسب get_object_or_404()أو get_list_or_404()الذي يثير Http404بدلاً من DoesNotExist. هذه الاختصارات المفيدة مناسبة لهذا الغرض فقط. لإنشاء كائن غير موجود ، هناك أيضًا ما هو مناسب get_or_create().

أساسيات فعالة

لقد أصبحت الآن قادرًا على التعامل مع هذه الأدوات الأساسية الثلاثة لبناء تطبيق Django الفعال - تهانينا!

هناك الكثير الذي يمكن لـ Django تقديمه لك ، لذا ترقبوا المقالات المستقبلية.

إذا كنت ستبني على GitHub ، فقد ترغب في إعداد GitHub Action الخاص بي من django-security-check. في غضون ذلك ، أنت في طريقك إلى إنشاء مشروع برمجي جميل.