QuerySet, использующий only () для получения ссылки без отсрочки - PullRequest
0 голосов
/ 12 ноября 2011

Примите во внимание следующее:

objs1 = MyModel.objects.filter(field1='1').only('foreign_key1','field2')
objs2 = MyModel.objects.filter(field1='2').only('foreign_key1','field2')

for o1 in objs1:
    matches = [o2 for o2 in objs2 if o1.foreign_key1==o2.foreign_key1]
    print len(matches)

only() делает все остальные поля отложенными.Однако AFAICT, хотя я просил foreign_key1 не откладывать, это так!и понимание списка занимает очень много времени из-за двойного попадания в базу данных за изменение.

Я также пробовал foreign_key1__id в наборах запросов, но это не помогло.Как я не могу deffer внешний ключ при использовании only()?

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Оказывается, проблема была не в only() вообще.Насколько я могу судить, only() не выбирает связанные модели, даже если вы дадите ему поле внешнего ключа.Для получения связанных моделей вам нужно select_related().Кроме того, обратите внимание, что если null=True для ForeignKey, вам также нужно указать select_related() конкретное поле внешнего ключа, например:

.select_related('foreign_key1')

, в моем случае также достаточно следующего:

.select_related('foreign_key1__id')
0 голосов
/ 04 ноября 2016

попробуйте это:

o1.foreign_key1_id==o2.foreign_key1_id

это должно помочь.

только ('xxxx_id') не имеет смысла.

...