Há muita documentação sobre como serializar um modelo QuerySet, mas como você serializa para JSON os campos de uma instância de modelo?
python
django
json
django-models
serialization
Jason Christa
fonte
fonte
django.core
para fazer isso. Algum motivo específico para não usar serializar o conjunto de consultas?Respostas:
Você pode facilmente usar uma lista para envolver o objeto necessário e é isso que os serializadores do django precisam para serializá-lo corretamente, por exemplo:
fonte
[0]
o final da sua última linha, como sugerido pelo @DavorLucic? E não há necessidade de vírgula à direita na lista (pelo amor ao PEP8;).Se você estiver lidando com uma lista de instâncias de modelo, o melhor que você pode fazer é usá-
serializers.serialize()
lo, ele atenderá perfeitamente à sua necessidade.No entanto, você deve enfrentar um problema ao tentar serializar um único objeto, não um
list
de objetos. Dessa forma, para se livrar de diferentes hacks, basta usar o Djangomodel_to_dict
(se não me engano, tambémserializers.serialize()
depende):Agora você só precisa de uma
json.dumps
ligação direta para serializar para json:É isso aí! :)
fonte
datetime
campos. Resolvido desta maneirajson.loads(serialize('json', [obj]))[0]
, enquanto serializer édjango.core.serializers.serialize
Para evitar o wrapper de matriz, remova-o antes de retornar a resposta:
Encontrei este post interessante sobre o assunto também:
http://timsaylor.com/convert-django-model-instances-to-dictionaries
Ele usa django.forms.models.model_to_dict, que parece a ferramenta perfeita para o trabalho.
fonte
Há uma boa resposta para isso e estou surpreso por não ter sido mencionado. Com algumas linhas, você pode lidar com datas, modelos e tudo mais.
Crie um codificador personalizado que possa manipular modelos:
Agora use-o quando você usa json.dumps
Agora, modelos, datas e tudo podem ser serializados e não precisam estar em uma matriz ou serializados e não serializados. Tudo o que você tem personalizado pode ser adicionado ao
default
método.Você pode até usar o JsonResponse nativo do Django desta maneira:
fonte
json.dumps
ejson.dump
métodos. Dessa forma, você não precisa alterar o fluxo de trabalho do aplicativo porque usa objetos personalizados ou adiciona outra chamada de método antes da conversão para json. Basta adicionar seu código de conversão no codificador e você está pronto para começar.Parece que o que você está perguntando envolve serializar a estrutura de dados de uma instância do modelo Django para interoperabilidade. Os outros pôsteres estão corretos: se você desejasse que o formulário serializado fosse usado com um aplicativo python que possa consultar o banco de dados via API do Django, você desejaria serializar um conjunto de consultas com um objeto. Se, por outro lado, o que você precisa é uma maneira de aumentar novamente a instância do modelo em outro lugar sem tocar no banco de dados ou sem usar o Django, então você tem um pouco de trabalho a fazer.
Aqui está o que eu faço:
Primeiro, eu uso
demjson
para a conversão. Foi o que encontrei primeiro, mas pode não ser o melhor. Minha implementação depende de um de seus recursos, mas deve haver maneiras semelhantes com outros conversores.Segundo, implemente um
json_equivalent
método em todos os modelos que você possa precisar serializar. Esse é um método mágicodemjson
, mas provavelmente é algo em que você vai querer pensar, independentemente da implementação escolhida. A idéia é que você retorne um objeto que seja diretamente conversível emjson
(ou seja, uma matriz ou dicionário). Se você realmente deseja fazer isso automaticamente:Isso não será útil para você, a menos que você tenha uma estrutura de dados completamente plana (não
ForeignKeys
, apenas números e seqüências de caracteres no banco de dados, etc.). Caso contrário, você deve pensar seriamente sobre a maneira correta de implementar esse método.Terceiro, ligue
demjson.JSON.encode(instance)
e você tem o que deseja.fonte
Se você está perguntando como serializar um único objeto a partir de um modelo e sabe que só obterá um objeto no conjunto de consultas (por exemplo, usando objects.get), use algo como:
o que lhe daria algo da forma:
fonte
Resolvi esse problema adicionando um método de serialização ao meu modelo:
Aqui está o equivalente detalhado para aqueles que são avessos a one-liners:
_meta.fields
é uma lista ordenada de campos de modelo que podem ser acessados a partir de instâncias e do próprio modelo.fonte
Aqui está minha solução para isso, que permite personalizar facilmente o JSON e organizar registros relacionados
Primeiramente implemente um método no modelo. Eu chamo é
json
mas você pode chamá-lo como quiser, por exemplo:Então, na exibição, eu faço:
fonte
car.json()
Use a lista, resolverá o problema
Passo 1:
Passo 2:
Etapa 3:
fonte
Para serializar e desserializar, use o seguinte:
fonte
.values()
é o que eu precisava para converter uma instância de modelo em JSON.Documentação .values (): https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
Exemplo de uso com um modelo chamado Projeto .
Nota: Estou usando o Django Rest Framework
Resultado de um ID válido:
fonte
Se você deseja retornar o objeto de modelo único como uma resposta json para um cliente, é possível fazer esta solução simples:
fonte
Use o Django Serializer com
python
formato,Qual a diferença entre
json
epython
formato?O
json
formato retornará o resultado comostr
considerandopython
que retornará o resultado em umlist
ouOrderedDict
fonte
OrderedDict
, nãodict
Parece que você não pode serializar uma instância, seria necessário serializar um QuerySet de um objeto.
Fico sem o
svn
lançamento do django, portanto isso pode não estar nas versões anteriores.fonte
Volto o ditado da minha instância
portanto, retorna algo como {'campo1': valor, "campo2": valor, ....}
fonte
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
que tal desta maneira:
ou excluir qualquer coisa que você não queira.
fonte
Todas essas respostas foram um pouco hacky em comparação com o que eu esperaria de uma estrutura, o método mais simples, eu acho, de longe, se você estiver usando a estrutura restante:
Isso usa o serializador diretamente, respeitando os campos que você definiu nele, bem como quaisquer associações, etc.
fonte