2014-06-17 56 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

相關問題