2014-10-02 107 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])