2014-01-23 113 views
0

我有一組GeneraricForeignKey字段的項目,我想通過一組對象來獲取附加到這些對象的項目,就像這樣。我正在考慮在所有記錄上做一個查詢集,然後添加過濾器以獲取附加到列表中對象的項目。Django:後續OR過濾器

像這樣:

models.py: 
from django.contrib.contenttypes.models import ContentType 
class Item(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField(db_index=True) 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

views.py: 
my_objects = list() 
my_objects.append(SomeObject.objects.get(id=1)) 
my_objects.append(SomeObject.objects.get(id=2)) 

items = Item.objects.all() 
for obj in my_objects: 
    items = items.filter(content_type=ContentType.objects.get_for_model(obj), object_id=obj.id) 

return items 

當我看到查詢此,列表中的每個對象單獨的過濾器是越來越邏輯與來過濾。有沒有一種方法可以合乎邏輯或呢?我嘗試這樣做:

from django.db.models import Q 
items = Item.objects.all() 
for obj in my_objects: 
    items = items.filter(
     Q(id__in=items) 
     | Q(content_type=ContentType.objects.get_for_model(obj), object_id=obj.id) 
    ) 

,但它實際上並沒有排除任何記錄,因爲還是允許他們在

回答

1

什麼,你需要做的是建立單獨的或運算條款:

object_filter = Q() 

for obj in my_objects: 
    object_filter = object_filter | Q(content_type=ContentType.objects.get_for_model(obj), 
      object_id=obj.id) 

items = Item.objects.filter(object_filter) 
+0

真棒,謝謝,我不知道如何構建過濾器,不知道我可以稱它爲Q(),然後添加到它。試着用字符串構造,然後eval(),但我知道這不是最合適的解決方案。完美的作品! – Furbeenator

+0

太棒了!快樂它幫助:) – rafaponieman