【问题标题】:how to make many-to-many in list display django more efficient如何使列表显示django中的多对多更有效率
【发布时间】: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


【解决方案1】:

您还需要将select_related('product') 作为get_queryset 的一部分吗?

很难说,因为我没有看到模型关系

【讨论】:

  • prefetch_related 用于 M2M。我也在问题中添加了模型。
猜你喜欢
  • 2013-08-09
  • 2011-04-20
  • 1970-01-01
  • 2011-01-05
  • 2014-11-11
  • 2020-05-04
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多