如何在values_list查询中使用Django GenericRelation

时间:2014-06-17 14:01:21

标签: django django-queryset

我的Django应用程序中有这两个模型:

class ItemOrigin(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    [...]

class Place(models.Model):
    name = models.CharField(max_length=256)
    origins = generic.GenericRelation(ItemOrigin)
    [...]

在Django 1.4中,以下查询过去起作用:

ItemOrigin.objects.values_list('id', 'place')

但是自从升级到Django 1.6后,该查询会生成以下错误消息:

FieldError: Cannot resolve keyword 'place' into field. Choices are: content_type, created, dubitable, evidence, historical_item, id, legacy_id, modified, object_id

我可能在升级说明中遗漏了一些内容,但我看不出有任何与此类查询相关的兼容性中断。

所以我的问题是:为什么它不再起作用,更重要的是,我如何解决它,以便相同的查询工作。我更喜欢一种解决方案,其中查询代码未被修改(很多),因为它比我的应用程序中的模型定义更难更改。这是因为我在动态中的查询系统和values_list中传递的字段列表是从配置文件派生的。

1 个答案:

答案 0 :(得分:2)

在Django< 1.6但未经测试且无证。有open ticket here

要获得解决方法,您可以执行以下操作:

ctype = ContentType.objects.get_for_model(Place)
pk_list = ItemOrigin.objects.filter(
    content_type=ctype
).values_list('object_id', flat=True)
places = Place.objects.filter(pk__in=pk_list)