不直接相关的Django预取表

时间:2019-12-09 11:11:40

标签: django

使用以下模型是否可以获取Category对象并预取OrderLine,以便category.orderlines.all()可以访问它?

class Category(models.Model):
    name = models.CharField(...)

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', ...)
    name = models.CharField(...)
    price = models.DecimalField(...)

class OrderLine(models.Model):
    product = models.ForeignKey(Product, related_name='orderlines', ...)

我知道您可以通过产品进行嵌套预取,但是我想直接从OrderLine访问Category对象,而不是通过Product

from django.db.models import Prefetch

categories = Category.objects.prefetch_related(Prefetch(
    'products__orderlines',
    queryset=OrderLine.objects.filter(...)
))

for category in categories:
    for product in category.products.all():
        for line in product.orderlines.all():
            ...

所需用法:

for category in categories:
    for line in category.orderlines.all():
        ...

更新

添加to_attr='orderlines'会导致:

  

ValueError:to_attr = orderlines与产品模型上的字段冲突。

更改属性名称to_attr='lines'不会导致错误,但是不会将属性添加到Category对象中。它会预取Product,然后向每个产品添加lines属性。

0 个答案:

没有答案