2013-03-22 21 views
5

tôi có các mô hình sau:django prefetch khi liệt kê các đối tượng trong quản trị

class UserProfile(models.Model): 
    name = models.CharField() 
    info = models.OneToOneField(UserInfo, related_name='user') 

class UserInfo(models.Model): 
    def __unicode__(self): 
    return self.user.__unicode__() + self.age 
    age = models.IntegerField() 

class Ticket(models.Model): 
    userinfo = models.ForeignKey(UserInfo) 

Vấn đề bây giờ là trong giao diện quản trị vé. Trường userinfo của vé được hiển thị dưới dạng menu thả xuống. Nếu có rất nhiều UserInfo trong cơ sở dữ liệu, mỗi người trong số họ thực hiện một cuộc gọi đến cơ sở dữ liệu (UserProfile) để tạo tên của nó.

Làm cách nào tôi có thể yêu cầu quản trị viên (hoặc bất kỳ tiện ích con nào) tìm nạp trước UserProfiles liên quan khi nó hiển thị menu thả xuống UserInfo?

Tôi đang tìm kiếm một cái gì đó giống như

info = models.OneToOneField(UserInfo, related_name='user', prefetch_in_bulk=True) 
+0

sử dụng 'return unicode (" {} + {} ". Định dạng (self.user, self.age))' thay vì những gì bạn có bây giờ ('__unicode__' phải trả về unicode, không phải chuỗi). –

Trả lời

8

tôi đã tìm ra một cách để làm điều này:

class TicketAdminForm(forms.ModelForm): 
    class Meta: 
    model = Ticket 
    userinfo = forms.ModelChoiceField(queryset=UserInfo.objects.prefetch_related('user').all()) 

class TicketAdmin(admin.ModelAdmin): 
    form = TicketAdminForm 

admin.site.register(Ticket, TicketAdmin) 

Bây giờ các mô hình cần được tìm nạp trước như một truy vấn một sql hơn nhiều truy vấn.

+5

Điều này thực sự nên là một phần của Django theo mặc định. Nó cần phải có đủ thông tin để có thể thực hiện một tối ưu hóa như vậy. –

Các vấn đề liên quan