我有以下型号:
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)
现在,问题出在故障单管理界面中。工单的userinfo字段呈现为下拉列表。如果数据库中有很多UserInfo,则每个用户都将对数据库(UserProfile)进行一次调用以生成其名称。
在呈现UserInfo下拉菜单时,如何告诉管理员(或任何小部件)预取相关的UserProfile?
我正在寻找类似的东西
info = models.OneToOneField(UserInfo, related_name='user', prefetch_in_bulk=True)
最佳答案
我想出了一种方法来做到这一点:
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查询而不是许多查询预取。
关于在admin中列出对象时的django预取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15563259/