2012-06-22 33 views
0

我在Django的prefetch_related时遇到了麻烦。Django prefetch_related在很多领域总是产生空阵列

这是我的模特。

class Terrain(models.Model): 
    name = models.CharField(max_length=255) 

class Route(models.Model): 
    name = models.CharField(max_length=255) 
    terrains = models.ManyToManyField(Terrain) 

而这里的时候我用prefetch_related会发生什么。

>>> Route.objects.all()[0].terrains.all() 
[<Terrain: Beach>] 
>>> Route.objects.all().prefetch_related('terrains')[0].terrains.all() 
[] 

任何想法我在做什么错在这里?

Python版本2.7 Django的1.4版本 DB后端:SQLite的(我也试图与MySQL的,相同的结果)

下面是(从IPython的控制台)一些查询调试所以你可以看到发生了什么事情在那里。

In [11]: Route.objects.all().prefetch_related('terrains')[0].terrains.all() 
DEBUG 2012-06-22 20:10:09,569 util (0.000) SELECT "asdf_route"."id", "asdf_route"."name" FROM "asdf_route" LIMIT 1; args=() 
DEBUG 2012-06-22 20:10:09,571 util (0.000) SELECT ("asdf_route_terrains"."route_id") AS "_prefetch_related_val", "asdf_terrain"."id", "asdf_terrain"."name" FROM "asdf_terrain" INNER JOIN "asdf_route_terrains" ON ("asdf_terrain"."id" = "asdf_route_terrains"."terrain_id") WHERE "asdf_route_terrains"."route_id" IN (1); args=(1,) 
Out[11]: [] 

回答

1

哎呀。找出问题所在。前段时间有一个错误,如果你的模型的pk字段是非文本的(像一个整数),prefetch_related将不起作用。我手动修补这一行:

vals = rel_obj_cache.get(instance_attr_val, []) 

附近query.py结束看起来像这样:

vals = rel_obj_cache.get(unicode(instance_attr_val), []) 

这固定我的问题。但从那以后,我猜这个问题是以另一种方式正式解决的,现在我的unicode强制导致该字典查找返回一个空列表(基本上与原始错误相反)。

所以,只好撤销我的手动补丁,现在它工作正常。难怪我找不到任何人有这个问题!