【发布时间】:2017-06-04 20:52:02
【问题描述】:
我正在使用 django 1.8。 我在 django admin 中显示了一个多对多字段,例如 this example。
class PurchaseOrder(models.Model):
product = models.ManyToManyField('Product')
vendor = models.ForeignKey('VendorProfile')
dollar_amount = models.FloatField(verbose_name='Price')
class Product(models.Model):
products = models.CharField(max_length=256)
def __unicode__(self):
return self.products
class PurchaseOrderAdmin(admin.ModelAdmin):
fields = ['product', 'dollar_amount']
list_display = ('get_products', 'vendor')
def get_products(self, obj):
return "\n".join([p.products for p in obj.product.all()])
问题是,如果我每页显示 100 行,它会执行 100 个查询。 对于外键,有一个神奇的 list_select_related 但你不能在其中放置多对多字段。 如何避免重复查询?
---更新:
我试过了:
def get_queryset(self, request):
qs = super(PurchaseOrderAdmin, self).get_queryset(request)
return qs.prefetch_related('products')
它仍然在每行重复查询。
【问题讨论】:
-
尝试使用 prefetch_related。它对每个关系进行单独的查找,并在 Python 中进行“连接”。这允许它预取多对多和多对一对象 (docs.djangoproject.com/en/1.10/ref/models/querysets/…)。希望这会有所帮助。
-
感谢@DmitryShilyaev 不幸的是它仍在重复查询。
标签: django-admin