Django可能嵌套预取相关吗?

时间:2016-10-17 09:59:24

标签: django prefetch

假设我有以下型号。

class Item(models.Model):

    seller = models.ForeignKey('seller.Seller')


class ItemSet(models.Model):

    items = models.ManyToManyField("Item", related_name="special_items")

我想做的是

对于给定的卖家,检索在ItemSet中存储为special_items的所有项目。

以下代码是我想出来的,没有尝试过,只是预感它不起作用。 :(
(我想检索item_founds和item_specials)

item_founds = Item.objects.filter(seller=seller).prefetch_related(
    Prefetch(
        "special_items",
        queryset=Items.objects.prefetch_related("items")
    )
)

item_specials = Item.objects.none()
for item_found in item_founds.all():
    for special_item in item_found.special_items.all():
        item_specials |= special_item.items.all()

1 个答案:

答案 0 :(得分:0)

在Django中,您必须始终从最终所需的模型中执行查询。在你的情况下是seller.Seller。否则你会得到糟糕的代码和冒险性能差(比如你的代码中你在循环中有两个查找...)

Seller.objects.get(pk=<seller id here>).prefetch_related(
    'items',
    queryset=Item.objects.exclude(
        special_items=None
    ),
    to_attr='item_specials'
)

哪个应该为您Seller提供item_specials属性中的一组特殊项目。