/ / QuerySet usando only () para buscar referência sem adiamento - django, django-queryset, adiado

QuerySet usando only () para buscar referência sem deferring - django, django-queryset, deferred

Considere o seguinte:

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() torna todos os outros campos adiados. No entanto AFAICT, embora eu tenha solicitado foreign_key1 não deve ser adiado, é! e a compreensão da lista leva muito tempo devido ao db ser atingido duas vezes por itteração.

Eu também tentei foreign_key1__id nos querysets, mas não ajudou. Como não posso adiar a chave estrangeira enquanto ainda uso only()?

Respostas:

2 para resposta № 1

Acontece que o problema não estava no only() em absoluto. Tanto quanto eu posso dizer only() não busca modelos relacionados, mesmo se você fornecer a ele o campo de chave estrangeira. Para buscar modelos relacionados, você precisa select_related(). Além disso, observe que se null=True para o ForeignKey, você também precisa dar select_related() o campo de chave estrangeira específico, como segue:

.select_related("foreign_key1")

o seguinte também é suficiente no meu caso:

.select_related("foreign_key1__id")

0 para resposta № 2

tente isto:

o1.foreign_key1_id==o2.foreign_key1_id

deve ajudar.

apenas ("xxxx_id") não faz sentido.