Como posso converter um Django QuerySet em uma lista de dicts? Não encontrei uma resposta para isso, então estou me perguntando se estou perdendo algum tipo de função auxiliar comum que todos usam.
Como posso converter um Django QuerySet em uma lista de dicts? Não encontrei uma resposta para isso, então estou me perguntando se estou perdendo algum tipo de função auxiliar comum que todos usam.
Respostas:
Use o .values()
método:
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
Nota: o resultado é um QuerySet
que geralmente se comporta como uma lista, mas não é realmente uma instância de list
. Use list(Blog.objects.values(…))
se você realmente precisar de uma instância de list
.
values()
, não sei se existe um bom método para fazer o mesmo, values()
mas também com a chamada dos métodos de instância ?!
O .values()
método retornará um resultado do tipo ValuesQuerySet
que normalmente é o que você precisa na maioria dos casos.
Mas, se desejar, você pode transformar ValuesQuerySet
em uma lista Python nativa usando a compreensão de lista Python, conforme ilustrado no exemplo abaixo.
result = Blog.objects.values() # return ValuesQuerySet object
list_result = [entry for entry in result] # converts ValuesQuerySet into Python list
return list_result
Acho que o acima ajuda se você estiver escrevendo testes de unidade e precisar afirmar que o valor de retorno esperado de uma função corresponde ao valor de retorno real, caso em que ambos expected_result
e actual_result
devem ser do mesmo tipo (por exemplo, dicionário).
actual_result = some_function()
expected_result = {
# dictionary content here ...
}
assert expected_result == actual_result
list(result)
Se você precisar de tipos de dados nativos por algum motivo (por exemplo, serialização JSON), esta é minha maneira rápida e suja de fazer isso:
data = [{'id': blog.pk, 'name': blog.name} for blog in blogs]
Como você pode ver, construir o dict dentro da lista não é realmente SECO, então se alguém conhece uma maneira melhor ...
data = list( blogs )
e então json.dumps( data )
. Um array sai com um monte de objetos do lado do javascript, nenhuma análise necessária.
Você não define exatamente a aparência dos dicionários, mas provavelmente está se referindo a QuerySet.values()
. Da documentação oficial do Django :
Retorna a
ValuesQuerySet
- umaQuerySet
subclasse que retorna dicionários quando usado como iterável, em vez de objetos de instância de modelo.Cada um desses dicionários representa um objeto, com as chaves correspondentes aos nomes dos atributos dos objetos do modelo.
Digite o elenco para a lista
job_reports = JobReport.objects.filter(job_id=job_id, status=1).values('id', 'name')
json.dumps(list(job_reports))
Você pode usar o values()
método no dict obtido no campo do modelo do Django no qual faz as consultas e, então, pode acessar facilmente cada campo por um valor de índice.
Chame assim -
myList = dictOfSomeData.values()
itemNumberThree = myList[2] #If there's a value in that index off course...
Você precisa DjangoJSONEncoder
e list
fazer o seu Queryset
para json
, ref: Python JSON serializar um objeto Decimal
import json
from django.core.serializers.json import DjangoJSONEncoder
blog = Blog.objects.all().values()
json.dumps(list(blog), cls=DjangoJSONEncoder)
Basta colocar list(yourQuerySet)
.
values()
retornar, passando-os como argumentos. Também tenha cuidado, embora pareça que os valores retornam uma lista de dados, na verdade, é um<class 'django.db.models.query.ValuesQuerySet'>
e não uma lista.