2011-05-31 56 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