محتويات الدورة

Django / سير تطبيق موثوق / الدرس 11

العروض العامة والترقيم المحدود

استخدم عقود العروض الصنفية عن قصد ورقم بيانات مقيدة مرتبة دون تحميل الكل.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • للتجريد التزامات عمر
  • فحص مرقم حتمي في الذاكرة
  • اختبار تركيب العرض وكلفة الاستعلام

للتجريد التزامات عمر

تزيل العروض العامة التكرار وتعرض طرائق للاستعلام والسياق والرد. افهمها قبل dispatch والمزج، ويؤثر ترتيب mixins فلا تنسخ القائمة عميانا. لا تفرض كل مستأجر وملكية تلقائيا. ضع المتغير لكل طلب بمثيله لا سمة صنف متغيرة. الهدف تقليل الآلية مع وضوح لا متحكم معتم. ويجب أن تكون مسؤولية كل mixin مفهومة ضمن ترتيب حل الطرائق، لأن تغيير ترتيب الوراثة قد يغير سلوك الحماية أو السياق دون تعديل جسم العرض.

عقد الترقيم أوسع من الأرقام

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

فحص مرقم حتمي في الذاكرة

يقسم المثال خمس قيم باثنتين ويفحص العدد والصفحات والثانية، وتقل الأخيرة. يثبت Paginator لا أداء ORM. تتسامح get_page مع مدخلات وفق توثيقها بينما page أكثر صرامة؛ اختر ولا تفترض تطابق الرفض. اختبر سلوك المسار العام وسياسة الغياب أو البديل الفعلية. وتختلف واجهة page الصارمة من get_page المتسامحة، لذلك يجب أن تتبع استجابة المدخل غير الصالح القرار المعلن للمسار لا افتراضا عن الاسمين.

python مثال تنفيذي معزول
from django.conf import settings
settings.configure(
    SECRET_KEY="synthetic-course-key",
    USE_I18N=False, USE_TZ=True,
    INSTALLED_APPS=[],
    DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
    DEFAULT_AUTO_FIELD="django.db.models.AutoField",
    ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()

from django.core.paginator import Paginator
paginator = Paginator([1, 2, 3, 4, 5], 2)
page = paginator.page(2)
print(paginator.count, paginator.num_pages)
print(list(page.object_list))
print(page.has_previous(), page.has_next())
الناتج المتوقع
5 3
[3, 4]
True True

تنتج خمس قيم ثلاث صفحات وتضم الوسطى ثلاثة وأربعة، وهي عينة لا معيار قاعدة.

تقييد القائمة الصنفية لكل طلب

يفترض المقطع النموذج والوسيط والقالب والمسارات. يحمي LoginRequiredMixin الدخول ويقيد get_queryset المستخدم قبل الترقيم بترتيب title/pk. يستخدم القالب page_obj ولا ينفذ المقطع قاعدة. قد تضيف صلاحية قدرة ولا تعوض نطاق الصفوف، وإذا فتح الحجم للطلب فتحقق وحده قبل paginate_by. وإذا أضيف اختيار حجم الصفحة لاحقا، فيجب تحديد افتراضي ومجال أقصى واضحين قبل استعماله، حتى لا يتحول عنصر التنقل إلى طلب موارد غير محدود.

python مقطع يتطلب سياق التطبيق
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView
from .models import Course

class MyCourseListView(LoginRequiredMixin, ListView):
    model = Course
    template_name = "catalog/my_courses.html"
    paginate_by = 20
    def get_queryset(self):
        return Course.objects.filter(owner=self.request.user).order_by("title", "pk")
الناتج المتوقع
In the declared app: each authenticated user sees only their courses, up to 20 per page.

يتطلب التطبيق ويطبق الملكية وفاصل الترتيب قبل الترقيم.

اختبار تركيب العرض وكلفة الاستعلام

اختبر الضيف ومستخدمين والتعادل والفراغ والطرفين والخطأ. احفظ بالروابط مرشحات معتمدة فقط لا أسرارا. قد يسبب القالب N+1 رغم الترقيم فحمّل الرسم على المقيد. راجع السياق والقالب، ولا تثبت 200 النطاق والترتيب والحد والمفاتيح؛ أكدها مستقلة ببيانات ممثلة. وقد تكون القائمة مقيدة ومقسمة بصورة صحيحة ثم ينفذ قالبها استعلاما لكل علاقة، لذلك ينبغي أن تشمل المراجعة مسار العرض الكامل لا الجلب وحده.

الأخطاء الشائعة وإصلاحها

تسمح mixin وتبقى الصفوف عامة

لماذا يحدث؟
اختلطت القدرة والرؤية.
كيف تصلحه؟
قيد get_queryset بالطلب.
كيف تتجنب تكراره؟
اختبر مالكين والمستبعد.

تتكرر الصفوف المتعادلة

لماذا يحدث؟
لا يوجد فاصل فريد.
كيف تصلحه؟
رتب حتميا ووثق التغير.
كيف تتجنب تكراره؟
اختبر تعادل المفتاح الرئيسي.

تستهلك الصفحة الصغيرة ذاكرة

لماذا يحدث؟
حُول الاستعلام كله لقائمة.
كيف تصلحه؟
رقم الاستعلام لا كل المجلب.
كيف تتجنب تكراره؟
قس الجلب والعرض.

اختبر فهمك

1. لماذا تضيف pk بعد title؟

اعرض الحل المشروح

قد يتكرر العنوان ويقدم المعرف فاصلا مستقرا. يثبت الترتيب ولا يجمد البيانات بين الطلبات، فتبقى سياسة التغير والتصدير لازمة.

2. ماذا تضيف قبل اختيار العميل حجم الصفحة؟

اعرض الحل المشروح

تحقق من الصيغة والمجال والافتراضي والأقصى وانقل المرشح المعتمد، واختبر التالف والصفر والسالب والضخم؛ فالترقيم حد موارد أيضا.

أهم ما تعلمته

  • تحفظ العروض العامة عقد عمرها.
  • قيد ورتب قبل الترقيم.
  • لا يجمد الترقيم البيانات.

المراجع الرسمية