2014-06-17 29 views
3

我在我的Django应用程序这两个型号:如何使用Django的GenericRelation在values_list查询

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中传递的字段列表是从配置文件派生的。

回答

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) 
+0

感谢:

有关解决方法,你可以做到这一点。我知道我可以这样查询它,但希望有一种方法可以避免它,并继续使用可以轻松进行参数化的单个查询。使事情复杂化的是,我还强制连接在原始查询(即包含没有位置或指向其他表的外部项目原始项)上外接左侧,因此Django 1.6强制的新版本非常令人失望。 – user3748764

+0

除非他们打算改变1.7版本,否则我认为你没有别的选择。此外,它的意外,所以你可能想要使用双重查询。 – Germano

+0

为了记录,我决定将GenericForeignKey转换为多个ForeignKey字段,因为它允许我保持我的动态查询系统完好无损,而不必与单独的查询混杂在一起。 – user3748764

相关问题