Obter chave estrangeira sem pedir todo o objeto

votos
0

Eu tenho um Foo modelo que tem uma ForeignKey para o modelo Usuário.

Mais tarde, eu preciso pegar tudo ID do usuário e colocar, em seguida, em uma lista

foos = Foo.objects.filter(...)

l = [ f.user.id for f in foos ]

Mas quando eu faço isso, Django agarra toda a instância de usuário do DB em vez de dar id-me apenas do usuário numérico, que existem em cada linha Foo.

Como posso obter todos os ids sem consultar cada usuário ou usando uma select_related?

obrigado

Publicado 24/01/2009 em 23:00
fonte usuário
Em outras línguas...                            


3 respostas

votos
5

Use valores de queryset de função () , que retornará uma lista de dicionários contendo pares nome / valor para cada atributo passados como parâmetros:

>>> Foo.objects.all().values('user__id')
[{'user__id': 1}, {'user__id' 2}, {'user__id': 3}]

O ORM, então, ser capaz de otimizar a consulta SQL para retornar apenas os campos necessários, em vez de fazer um "SELECT *".

Respondeu 25/01/2009 em 01:41
fonte usuário

votos
3

Sempre que você definir um ForeignKey em Django, ele adiciona automaticamente um campo FIELD_ID ao seu modelo.

Por exemplo, se Footem uma FK para Usercom um atributo chamado " user", então você também tem um atributo chamado user_id que contém o ID do usuário relacionado.

l = [ f.user_id for f in foos ]

Chamado .values()também adiciona desempenho se você selecionar seus atributos sabiamente

Respondeu 28/01/2009 em 06:11
fonte usuário

votos
0

Nevermind ... eu não tenho certeza por que isso não funcionou antes, quando eu tentei, mas este é como fazer:

l = [ f.user_id for f in foos ]
Respondeu 24/01/2009 em 23:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more