过滤GenericForeignKey中的内部字段

时间:2016-05-05 21:03:21

标签: python django django-models

我有以下型号:

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)

所以我有两种类型的商品,ItemAItemB都有catagory_id作为fieid。

费率模型是GenericForignKey。我想要的是一个Rate表,它对ItemAItemB类型的任何项目进行评分。

我的问题是,我希望在特定时刻过滤Rate表中属于特定类别的所有项目。

类似的东西:

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

但我无法做到。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我无法想到在一个查询中执行此操作的简单方法,因为content_object已启用GenericForeignKey,因此无法在过滤器中使用。

来自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)

考虑到这一点,我将采用以下方式:

我会获得ItemAItemB具有特定category_id的所有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)