Почему Django RelatedManager не кэширует объект, из которого был вызван поиск, на целевом объекте? - PullRequest
4 голосов
/ 31 января 2012

Если у меня есть следующие модели:

class Fubar(models.Model):
    name = models.CharField()

class Related(models.Model):
    fubar = models.ForeignKey(Fubar)

Я ожидаю, что ORM волшебным образом кеширует родительский объект Fubar, если я получу доступ к Связанному с помощью .related_set:

fubar = Fubar.objects.all()[0]
related = fubar.related_set.all()[0]
related.fubar

Топриводит к 3 запросам, где я ожидаю, что это приведет только к 2, так как related.fubar может быть оптимизирован в этом контексте, чтобы быть тем же объектом, который я назвал RelatedManager.

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Хотя я не уверен, почему это не работает (за исключением, может быть, магического сокращения), вы можете легко избежать дополнительного запроса с помощью

fubar.related_set.select_related('fubar')[0]
0 голосов
/ 31 января 2012

В django 1.4 они вводят prefetch_related , который автоматически извлекает в одном пакете связанные объекты для каждого из указанных поисков.

...