2012-06-22 3 views
0

장고의 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() 
[] 

내가 뭘 잘못하고있어?

파이썬 버전 2.7 장고 버전 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), []) 

나는 수동으로이 줄을 패치. 하지만 그때 이후로 문제는 공식적으로 다른 방식으로 해결되었다고 생각합니다. 이제는 유니 코드 캐스트가 사전 목록을 통해 빈 목록 (기본적으로 원래 버그와 반대)을 반환하게되었습니다.

내 수동 패치를 실행 취소해야만 이제는 제대로 작동합니다. 아무도 내가이 문제를 가진 다른 사람을 찾을 수 없다는 것은 놀라운 일이 아닙니다!

관련 문제