2011-05-31 61 views
1

我有以下数据结构:FruitObject与领域FruitTypeFruitColor。另一方面,我有FruitOffer(这是用户输入)。它与FruitObject相同,并由用户输入(某种需求支持配对系统;我们输入FruitObjects和用户输入FruitOffers;任务是配对它们并查看用户提供给我们的内容 - 选择只有特定用户的FruitObjects等于FruitOffers)。Django的 - __in数据库查询

所以逻辑上我用__in选择来获得所需的数据:

select = FruitObject.objects.filter(FruitType__in=FruitOffer.objects.filter(user=request.user).values("FruitType")) 

现在到了困难的部分,我 - 我需要FruitColor添加到选择并获得不少一对多的选择这符合两个条件(每个fruitObject得到offerObject是类型和颜色的两个

select = FruitObject.objects.filter(FruitType__in=FruitOffer.objects.filter(user=request.user).values("FruitType"), FruitColor__in=FruitOffer.objects.filter(user=request.user).values("FruitColor")) 

但逗号更像或在这种情况下操作,并返回我的一切VAL具有特定类型或特定颜色的ues。

如何将条件添加到__in select?如果我想添加更多条件(如价格或品味),是否会以相同的方式完成?提前致谢。

回答

2

困难的方法。

FruitObject.objects.filter(reduce(operator.or_, (Q(FruitColor=color, FruitType=type) for (color, type) in FruitOffer.objects.filter(user=request.user).values_list('FruitColor', 'FruitType')))) 
1
from django.db.models import Q 
fruit_type = FruitOffer.objects.filter(user=request.user).values("FruitType") 
fruit_color= FruitOffer.objects.filter(user=request.user).values("FruitColor") 

select = FruitObject.objects.filter(Q(FruitType__in=fruit_type)) & Q(FruitColor__in=fruit_color)) 
+2

这并不交叉匹配,而不是一个内匹配;如果存在“A×1”和“B×2”,则它也将匹配“A×2”和“B×1”。 – 2011-05-31 10:03:55

+0

是的,Ignacio是正确的,它是一个交叉匹配并返回等于A,B,1或2的所有值。不是等于A1和B2的值 – Ruslan 2011-05-31 10:18:15