gpt4 book ai didi

python - 获取 Django 中所有唯一的 prefetch_lated 对象

转载 作者:行者123 更新时间:2023-12-02 12:15:56 24 4
gpt4 key购买 nike

在 models.py 中:

from django.db import models
...
class Product(models.Model):
...
recommended = models.ManyToManyField('self', blank=True)
...

如果我有一个产品查询集,我怎样才能获得所有唯一的推荐对象?
例如:产品“A”有 3 个推荐产品:“B”、“C”和“D”,产品“B”有 2 个推荐产品:“C”和“E”,在查询集中“产品”中,我们有“A”和“B”产品,在此示例中:

# get_products() returns QuerySet of «A» and «B» products
products = get_products().prefetch_related('recommended')
recommended = [item for p in products for item in p.recommended.all()]

我们将得到 [«B», «C», «D», «C», «E»] 的列表,但如何仅获取 [«B», «C», «D», «E »]?

附注当然我们可以在“for”循环中过滤对象,但也许有更有效和公平的方法?...

更新 #1(对 Mark Galloway 的回答):

products = self.request.basket.get_products().prefetch_related(
Prefetch('recommended', queryset=models.Product.objects.distinct()))
recommended_list = [item for p in products for item in p.recommended.all()]

返回:

[<Product: Vestibulum ante ipsum primis in>, <Product: Vivamus quis turpis>, <Product: Pellentesque habitant>, <Product: Vivamus quis turpis>]

哪里<Product: Vivamus quis turpis>重复

附注有人知道吗?

最佳答案

您可以使用 Prefetch 为 prefetch_related 定义更具体的查询。对象。

prefetch = Prefetch('recommended', queryset=Product.objects.distinct()))
products = get_products().prefetch_related(prefetch)
recommended_list = list(set([item for p in products for item in p.recommended.all()]))

关于python - 获取 Django 中所有唯一的 prefetch_lated 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31451176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com