2016-05-05 45 views
0

內場,我有以下型號:過濾內GenericForeignKey

class Category(models.Model): 
    name = models.CharField(max_length=500) 

class ItemA(models.Model): 
    catagory_id = model.ForeignKey('Category') 

class ItemB(models.Model): 
    catagory_id = model.ForeignKey('Category') 

class Rate(model.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 
    rate = models.DecimalField(max_digits=3) 

所以我有兩個類型的項目,意達和ItemB雙方都catagory_id作爲fieid。

Rate模型是GenericForignKey。我想要的是一個評分表,對類型爲ItemA和ItemB的任何項目進行評分。

我的問題是,我想過濾在給定的時刻,來自特定類別的費率表中的所有項目。

類似的東西:

item = Rate.objects.filter(content_object__catagory_id=1) 

,但我不能這樣做。

有什麼想法?

回答

0

我想不出一個簡單的方法可以在一個查詢中執行此操作,因爲GenericForeignKey已啓用的content_object不能在過濾器中使用。

documentation

由於道路GenericForeignKey實現,你不能直接通過數據庫API過濾器(filter()exclude(),例如)使用等領域。由於GenericForeignKey不正常的域對象,這些實例將無法正常工作:

# This will fail 
>>> TaggedItem.objects.filter(content_object=guido) 
# This will also fail 
>>> TaggedItem.objects.get(content_object=guido) 

考慮到這一點,這裏是我會怎麼處理它:

我會得到所有的IDS對於ItemAItemB哪些具體該category_id

item_a_ids = list(ItemA.objects.filter(category_id=category_id).values_list('pk', flat=True)) 
item_b_ids = list(ItemB.objects.filter(category_id=category_id).values_list('pk', flat=True)) 

# combine these two id lists 
all_item_ids = item_a_ids + item_b_ids 

# now that we have these let's filter the Rate objects with __in operator 
rates = Rate.objects.filter(object_id__in=all_item_ids)