دليل شامل لكتابة Views، Models، و Queries فعالة في Django

دقائق القراءة: 7

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

  • الـ Views القائمة على الفئات مقابل الـ Views القائمة على الدوال.
  • نماذج (Models) Django.
  • استرجاع الكائنات باستخدام الاستعلامات.

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

الـ Views القائمة على الفئات (Class-based Views) مقابل الـ Views القائمة على الدوال (Function-based Views)

من المهم أن نتذكر أن Django يعتمد بالكامل على لغة بايثون في جوهره. عندما يتعلق الأمر بـ Views (طرق العرض)، يكون لديك خياران رئيسيان: دوال العرض (المعروفة أحيانًا باسم function-based views) أو الـ Views القائمة على الفئات (class-based views).

الـ Views القائمة على الدوال: مرونة عالية وتحديات محتملة

عندما قمت ببناء مشروع ApplyByAPI في البداية، كان يتألف كليًا من function-based views. توفر هذه الدوال تحكمًا دقيقًا ومناسبًا لتطبيق منطق معقد. تمامًا كما هو الحال في دالة بايثون العادية، لديك سيطرة كاملة (للأفضل أو للأسوأ) على ما تفعله الـ View. ولكن مع هذه السيطرة الكبيرة تأتي مسؤولية أكبر، وقد تكون الـ function-based views مملة بعض الشيء في الاستخدام، حيث تكون مسؤولاً عن كتابة جميع الدوال المساعدة (methods) اللازمة لعمل الـ View، وهذا ما يسمح لك بتخصيص تطبيقك بالكامل.

في حالة ApplyByAPI، كانت هناك أماكن قليلة جدًا تتطلب هذا المستوى من الوظائف المخصصة. في كل مكان آخر، بدأت الـ function-based views تزيد من صعوبة العمل. أصبحت كتابة View مخصصة لعمليات روتينية مثل عرض البيانات في صفحة قائمة مملة، ومتكررة، وعرضة للأخطاء. مع الـ function-based views، ستحتاج إلى معرفة أي دوال Django يجب تنفيذها للتعامل مع الطلبات وتمرير البيانات إلى الـ Views. كما أن اختبار الوحدات (Unit testing) قد يتطلب جهدًا إضافيًا. باختصار، التحكم الدقيق الذي توفره الـ function-based views يتطلب أيضًا جهدًا دقيقًا ومضنيًا لتنفيذه بشكل صحيح.

التحول إلى الـ Views القائمة على الفئات: تبسيط الكود وزيادة الكفاءة

في نهاية المطاف، قمت بتأجيل إطلاق ApplyByAPI بينما أعدت هيكلة غالبية الـ Views إلى class-based views. لم يكن هذا العمل بسيطًا، لكن عندما انتهيت، حصلت على مجموعة من الـ Views الصغيرة التي أحدثت فرقًا كبيرًا. انظروا إلى هذا المثال:

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

إنها ثلاثة أسطر فقط! لقد أصبحت بيئة عمل المطور، وحياتي بشكل عام، أسهل بكثير.

يمكن اعتبار الـ class-based views كقوالب جاهزة تغطي معظم الوظائف التي يحتاجها أي تطبيق. هناك Views لعرض قوائم الكائنات، ولعرض كائن واحد بتفاصيله، و Views للتحرير التي تؤدي عمليات CRUD (إنشاء، قراءة، تحديث، حذف). نظرًا لأن تنفيذ إحدى هذه الـ Views العامة (generic views) يتطلب بضعة أسطر فقط من الكود، أصبح منطق تطبيقي أكثر إيجازًا بشكل كبير. هذا قلل من تكرار الكود، وقلل من الأماكن المحتملة للأخطاء، وجعل التطبيق أكثر قابلية للإدارة بشكل عام.

تتميز الـ class-based views بسرعة التنفيذ والاستخدام. قد تتطلب الـ Views العامة المضمنة في Django جهدًا أقل في الاختبار، حيث لا تحتاج إلى كتابة اختبارات للـ View الأساسية التي يوفرها Django (يقوم Django باختباراته الخاصة لذلك؛ لا حاجة لتطبيقك للتحقق المزدوج). لتعديل View عامة لتناسب احتياجاتك، يمكنك إنشاء فئة فرعية (subclass) من الـ View العامة وتجاوز (override) السمات (attributes) أو الدوال المساعدة (methods) الخاصة بها. في حالتي، بما أنني كنت بحاجة فقط لكتابة اختبارات لأي تخصيصات أضفتها، أصبحت ملفات الاختبار الخاصة بي أقصر بشكل كبير، وكذلك الوقت والموارد اللازمة لتشغيلها.

متى تختار أي نوع من الـ Views؟

عند الموازنة بين الـ function-based views والـ class-based views، ضع في اعتبارك مقدار التخصيص الذي تحتاجه الـ View، والعمل المستقبلي اللازم لاختبارها وصيانتها. إذا كان المنطق شائعًا، فقد تتمكن من البدء بسرعة باستخدام class-based view عامة. أما إذا كنت بحاجة إلى دقة كافية تجعل إعادة كتابة دوال الـ View الأساسية أمرًا معقدًا للغاية، ففكر في استخدام function-based view بدلاً من ذلك.

نماذج (Models) Django: هيكلة البيانات بفعالية

تعمل الـ Models في Django على تنظيم المفاهيم الأساسية لتطبيقك، مما يجعلها مرنة، قوية، وسهلة التعامل معها. إذا تم استخدامها بحكمة، فإن الـ Models تمثل طريقة قوية لتجميع بياناتك في مصدر موثوق ووحيد للحقيقة. مثل الـ Views، يوفر Django بعض أنواع الـ Models المدمجة لتسهيل تنفيذ المصادقة الأساسية، بما في ذلك نموذجي User و Permission. لكل شيء آخر، يمكنك إنشاء نموذج يعكس مفهومك عن طريق الوراثة من فئة Model الأب.

 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، فإنك تقوم بإنشاء فئة فرعية (subclass) من فئة Model في Django وتستفيد من كل قوتها. كل نموذج تقوم بإنشائه عادةً ما يتطابق مع جدول في قاعدة البيانات، وكل سمة (attribute) فيه هي حقل في قاعدة البيانات. يمنحك هذا القدرة على إنشاء كائنات للعمل معها يمكن للبشر فهمها بشكل أفضل.

يمكنك جعل النموذج مفيدًا لك عن طريق تعريف حقوله. يتم توفير العديد من أنواع الحقول المدمجة بشكل ملائم. تساعد هذه الحقول Django على تحديد نوع البيانات، و widget الـ HTML الذي يجب استخدامه عند عرض النموذج (form)، وحتى متطلبات التحقق من صحة النموذج (form validation). إذا احتجت إلى ذلك، يمكنك كتابة حقول نموذج مخصصة (custom model fields).

تحديد العلاقات بين النماذج

يمكن تعريف علاقات قاعدة البيانات باستخدام حقل ForeignKey (علاقة رأس بأطراف – many-to-one)، أو ManyToManyField (علاقة أطراف بأطراف). وإذا لم تكن هذه كافية، فهناك أيضًا حقل OneToOneField (علاقة رأس برأس). تسمح لك هذه الحقول معًا بتحديد العلاقات بين نماذجك بمستويات تعقيد لا يحدها سوى خيالك (اعتمادًا على خيالك، قد يكون هذا ميزة أو لا).

استرجاع الكائنات باستخدام الاستعلامات (Queries)

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

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

تحسين أداء الاستعلامات

تعيد بعض الدوال المساعدة QuerySet جديدًا، مثل filter() أو exclude(). يمكن أن يمنحك ربط هذه الدوال استعلامات قوية دون التأثير على الأداء، حيث لا يتم جلب الـ QuerySets من قاعدة البيانات حتى يتم تقييمها (evaluated). تشمل الدوال التي تقوم بتقييم الـ QuerySet ما يلي: get()، count()، len()، list()، أو bool(). التكرار (iterating) على 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. في غضون ذلك، أنت في طريقك لبناء مشروع برمجي رائع.

تُظهر هذه المقالة بوضوح كيف يمكن للاختيارات التصميمية في Django، سواء في الـ Views، الـ Models، أو الاستعلامات، أن تؤثر بشكل كبير على كفاءة التطبيق وقابليته للصيانة. التحول من الـ function-based views إلى الـ class-based views يمثل نقلة نوعية في تبسيط الكود وتقليل التكرار للمهام الشائعة. كما أن الاستخدام الأمثل للـ Models وعلاقاتها يضمن هيكلة بيانات متينة وموثوقة. وأخيرًا، فهم كيفية عمل الـ QuerySets وتأجيل تقييمها (lazy evaluation) هو مفتاح لتحسين أداء قاعدة البيانات، مما يجعل Django خيارًا ممتازًا لتطوير تطبيقات ويب قوية وسريعة.

فيكتوريا دريك، مهندسة برمجيات رئيسية في مؤسسة كبرى، ورحالة رقمية سابقة (54 مدينة، 11 دولة). خبيرة في الشركات الناشئة. تكتب عن التكنولوجيا، فرق التطوير عالية الإنتاجية، والعيش في عصر الذكاء الاصطناعي.

إذا وصلت إلى هنا، اشكر الكاتب لتبين له اهتمامك. قل شكرًا.

تعلم البرمجة مجانًا. ساعد منهج freeCodeCamp مفتوح المصدر أكثر من 40,000 شخص في الحصول على وظائف كمطورين. ابدأ.

إعلان.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *