在admin中列出对象时的django预取

时间:2013-03-22 05:19:48

标签: django django-forms django-admin

我有以下模特:

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)

问题现在在Ticket管理界面中。 Ticket的userinfo字段呈现为下拉列表。如果数据库中有很多UserInfo,则每个UserInfo都会对数据库(UserProfile)进行一次调用以生成其名称。

如何在呈现UserInfo下拉列表时告诉管理员(或任何小部件)预取相关的UserProfiles?

我正在寻找像

这样的东西
info = models.OneToOneField(UserInfo, related_name='user', prefetch_in_bulk=True)

1 个答案:

答案 0 :(得分:8)

我想出了一种方法:

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)

现在所需的模型被预取为一个sql查询而不是许多查询。