我有以下型号:
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)
所以我有两种类型的商品,ItemA
和ItemB
都有catagory_id
作为fieid。
费率模型是GenericForignKey
。我想要的是一个Rate表,它对ItemA
和ItemB
类型的任何项目进行评分。
我的问题是,我希望在特定时刻过滤Rate表中属于特定类别的所有项目。
类似的东西:
item = Rate.objects.filter(content_object__catagory_id=1)
但我无法做到。
有什么想法吗?
答案 0 :(得分:0)
我无法想到在一个查询中执行此操作的简单方法,因为content_object
已启用GenericForeignKey
,因此无法在过滤器中使用。
由于
GenericForeignKey
的实施方式,您无法通过数据库API直接将这些字段用于过滤器(例如filter()
和exclude()
)。由于GenericForeignKey
不是普通的字段对象,因此这些示例不起作用:# This will fail >>> TaggedItem.objects.filter(content_object=guido) # This will also fail >>> TaggedItem.objects.get(content_object=guido)
考虑到这一点,我将采用以下方式:
我会获得ItemA
和ItemB
具有特定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)