python - لغة - حل مشكلة الترقيم التلقائى عند حذف سجل من قاعدة البيانات




كفاءة ترقيم الصفحات واستعلام قاعدة البيانات في جانغو (2)

باستخدام المعلومات المذكورة أعلاه جئت مع وظيفة ديكور ديكور. يأخذ json_list_objects الكائنات ديانوغ إلى ديكسون بيكسون جاهزة ديكتس من حقول العلاقة المعروفة من الكائنات جانغو وإرجاع قائمة جونسونيد كما {كونت: ريسولتس:}.

وقد يجد آخرون أنه من المفيد.

def with_paging(fn):
  """
  Decorator providing paging behavior.  It is for decorating a function that 
  takes a request and other arguments and returns the appropriate query
  doing select and filter operations.  The decorator adds paging by examining
  the QueryParams of the request for page_size (default 2000) and 
  page_num (default 0).  The query supplied is used to return the appropriate
  slice. 
  """
  @wraps(fn)
  def inner(request, *args, **kwargs):
    page_size = int(request.GET.get('page_size', 2000))
    page_num = int(request.GET.get('page_num', 0))
    query = fn(request, *args, **kwargs)
    start = page_num * page_size
    end = start + page_size
    data = query[start:end]
    total_size = query.count()
    return json_list_objects(data, overall_count=total_size)
  return inner

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

# in views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

... 
...    

def someView():
    models = Model.objects.order_by('-timestamp')
    paginator = Paginator(models, 7)
    pageNumber = request.GET.get('page')

    try: 
        paginatedPage = paginator.page(pageNumber)
    except PageNotAnInteger: 
        pageNumber = 1
    except EmptyPage: 
        pageNumber = paginator.num_pages
    models = paginator.page(pageNumber)

    return render_to_resp ( ..... models ....)

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

أيضا، موضوع ذات الصلة. إذا قام شخص ما بما يلي:

   Model.objects.all()[:40]

هل هذا الرمز يعني أن جميع النماذج يتم دفعها إلى الذاكرة، ونحن لصق من 40 منهم؟ وهو أمر سيء. أم أنه يعني أننا الاستعلام ودفع فقط 40 الأشياء في فترة الذاكرة؟

شكرا لك على مساعدتك!


لا يوجد شيء الذاكرة غير فعالة عند استخدام باجيناتور. يتم تقييم كيريسيتس بالكسل. في المكالمة الخاصة بك Paginator(models, 7) ، models هو كيريسيت التي لم يتم تقييمها حتى هذه النقطة. لذلك، حتى الآن لم يتم ضرب قاعدة البيانات. كما لا توجد قائمة تحتوي على جميع مثيلات النموذج في الذاكرة عند هذه النقطة.

عندما تريد الحصول على صفحة أي في paginatedPage = paginator.page(pageNumber) ، يتم التقطيع على هذا القارئ، فقط عند هذه النقطة يتم ضرب قاعدة البيانات و قاعدة البيانات إرجاع لك كيريسيت تحتوي على مثيلات نموذج. ثم تقطيع الشرائح فقط الكائنات التي يجب أن تكون هناك على الصفحة. لذلك، فقط الكائنات المقطوعة سوف تذهب في القائمة التي ستكون هناك في الذاكرة. قل على صفحة واحدة تريد أن تظهر 10 كائنات، فقط هذه الكائنات 10 ستبقى في الذاكرة.

عندما يفعل شخص ما؛

Model.objects.all()[:40]

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





querying