【问题标题】:Django prefetch_related on many to many field always yields empty array多对多字段上的 Django prefetch_related 总是产生空数组
【发布时间】:2012-06-22 20:19:13
【问题描述】:

我遇到了 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 版 数据库后端: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]: []

【问题讨论】:

    标签: django orm many-to-many prefetch


    【解决方案1】:

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

    vals = rel_obj_cache.get(instance_attr_val, [])
    

    在 query.py 的末尾看起来像这样:

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

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

    所以,只需撤消我的手动补丁,现在它工作正常。难怪我找不到其他人遇到这个问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2017-02-19
      • 2013-04-27
      相关资源
      最近更新 更多