【问题标题】:django prefetch when listing objects in admin在管理员中列出对象时的 django 预取
【发布时间】:2013-03-11 21:23:49
【问题描述】:

我有以下型号:

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 的 userinfo 字段呈现为下拉菜单。如果数据库中有很多 UserInfo,每个人都会对数据库(UserProfile)进行一次调用以生成其名称。

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

我正在寻找类似的东西

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

【问题讨论】:

  • 使用 return unicode("{} + {}".format(self.user,self.age)) 而不是你现在拥有的(__unicode__ 应该返回 unicode,而不是字符串)。

标签: django django-forms django-admin


【解决方案1】:

我想出了一种方法:

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 查询而不是多个查询。

【讨论】:

  • 默认情况下这应该是 Django 的一部分。它应该有足够的信息来进行这样的优化。
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 2016-04-16
  • 2012-02-16
  • 2014-01-23
  • 2018-05-30
  • 2021-05-28
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多