在models.py中:
from django.db import models
...
class Product(models.Model):
...
recommended = models.ManyToManyField('self', blank=True)
...
如果我有一个Product的查询集,我如何获得所有唯一的推荐对象?
例如:产品«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 »]
P.S。当然我们可以过滤«for»循环中的对象,但也许有更有效和公平的方式? ...
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>
重复
P.S。有人知道吗?
答案 0 :(得分:2)
您可以使用Prefetch对象为prefetch_releated定义更具体的查询。
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()]))
答案 1 :(得分:0)
假设您的模型如下(根据您的描述和输出,我假设您必须有symmetrical=False
):
class Product(models.Model):
recommended = models.ManyToManyField('self', blank=True, symmetrical=False, related_name='recommended_by')
然后我认为以下是你所追求的:
Product.objects.filter(recommended_by__in=get_products()).distinct()
>>> <QuerySet [<Product: B>, <Product: C>, <Product: D>, <Product: E>]>