2014-10-02 25 views
0

我有一個Story模型,它通過django-tagging應用程序包含一個TagField。 我正在讀取特定標籤的故事列表。在功能上,我的代碼工作正常,但我遇到了一個我不太明白的行爲。切片查詢集是否與切片__in子句中使用的列表相同?無法理解此行爲

以下代碼正確地爲我提供了所需的故事列表。

ct = ContentType.objects.get_for_model(Story) 
    ti = TaggedItem.objects.filter(tag__name='mobile',content_type=ct).values_list('object_id',flat=True) 
    stories = Story.published_objects.filter(id__in=ti) 

但是,我只想要第一個50個故事。所以我做了什麼:

ct = ContentType.objects.get_for_model(Story) 
    ti = TaggedItem.objects.filter(tag__name='mobile',content_type=ct).values_list('object_id',flat=True) 
    ti50 = ti[:50] 
    stories = Story.published_objects.filter(id__in=ti50) 

在這裏,我切列表本身只持有50個ID,然後送入切片列表__in條款。所以我預計列表中有50個故事。不過,我得到這個錯誤,而不是:

DatabaseError: (1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'") 

我不明白爲什麼在MySQL的正在使用的LIMIT但我想在Python本身事先切它。 對此有何解釋?

回答

0

你不是「切片清單本身」。 ti仍然是一個查詢集,並且切片本身仍然不評估它。所以,當你把它放在__in子句中時,它仍然是一個代表未經評估的數據庫查詢的對象。 Django試圖將其作爲主要Story查詢中的子查詢來傳遞,但是如錯誤消息所示,MySQL不支持該查詢。

如果你想通過50個ID,您必須通過轉換爲一個列表中明確評估查詢:

ti50 = list(ti[:50])