2013-02-25 18 views
9

Tôi có một hệ thống hiện có mà tôi đang tìm cách giới hạn số lượng đối tượng liên quan được hiển thị trong nội tuyến quản trị viên.django admin truy vấn nội tuyến giới hạn

Ví dụ: tôi có một mô hình trong quản trị viên có nội tuyến có thể có tối đa hàng nghìn bản ghi có liên quan. Tôi chỉ muốn hiển thị các hồ sơ gần đây nhất (nói rằng các bản ghi 5.000 bực bội nhất). (Lý tưởng nhất, người ta có thể phân trang thông qua các bản ghi nội tuyến, nhưng chỉ giới hạn chúng là đủ cho tôi). Tôi muốn tránh tình huống trang quản trị tải với bản ghi 60K nội tuyến, làm treo trình duyệt và đánh thuế máy chủ.

Dựa trên những câu dưới đây SO, tôi đã tạo ra đoạn mã sau: How to limit queryset/the records to view in Django admin site?

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    def queryset(self, request): 
     qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created')[:5000] 
     return qs 

Tuy nhiên, tôi nhận được một "không thể lọc một truy vấn một lần một lát đã được thực hiện". Tôi thậm chí đã thử sử dụng một paginator, nhưng có được cùng một lỗi.

from django.core.paginator import Paginator 

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    def queryset(self, request): 
     qs = super(TicketNoteAdmin, self).queryset(request).order_by('-created') 
     p = Paginator(qs, 5000) 
     page1 = p.page(1) 
     return page1.object_list 

Tôi hiểu tại sao tôi gặp lỗi này, nhưng tôi tự hỏi liệu có cách tiếp cận khác sẽ cho phép tôi hạn chế số đối tượng nội tuyến được hiển thị hay không. Có lẽ quản trị viên không được thiết kế để làm việc với nhiều đối tượng nội tuyến này, nhưng cảm thấy rằng phải có cách để hạn chế bản ghi quản trị nội bộ và ngăn chặn các tình huống mà trình duyệt/máy chủ có thể gặp sự cố do có quá nhiều đối tượng nội tuyến. Bất cứ lời khuyên được nhiều đánh giá cao. Cảm ơn bạn đã đọc.

Trả lời

10

Hãy thử điều này:

from django.forms.models import BaseInlineFormSet 

class TicketNoteFormSet(BaseInlineFormSet): 
    def get_queryset(self) : 
     qs = super(TicketNoteFormSet, self).get_queryset() 
     return qs[:5000] 

class TicketNoteAdmin(models.TabularInline): 
    model = models.TicketNote 
    formset = TicketNoteFormSet 
+1

Mã formset chỉ giả định rằng get_queryset sẽ trả lại đối tượng queryset giống nhau mỗi lần và đó queryset rằng sẽ có kết quả DB cache. Sau đó, get_queryset của BaseModelFormSet tiết kiệm một cách rõ ràng cá thể QS trên bản thân. Nếu bạn ghi đè phương thức đó và bạn không muốn hàng nghìn truy vấn db, bạn sẽ cần phải làm như vậy. –