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 № 1Acontece 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.