序列化包含Django查询集的对象 [英] Serializing objects containing django querysets

查看:109
本文介绍了序列化包含Django查询集的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Django提供了序列化查询集(django.core.serializers)的工具,但是序列化存在于其他对象(如字典)中的查询集又如何呢?

Django provides tools to serialize querysets (django.core.serializers), but what about serializing querysets living inside other objects (like dictionaries)?

我要序列化以下字典:

dictionary = { 'alfa': queryset1, 'beta': queryset2, } 

我决定使用 simplejson (django附带)进行此操作. 我通过以下方式扩展了 simplejson.JSONEncoder :

I decided to do this using simplejson (comes with django). I extended simplejson.JSONEncoder the following way:

from django.utils import simplejson
from django.core import serializers

class HandleQuerySets(simplejson.JSONEncoder):
     """ simplejson.JSONEncoder extension: handle querysets """
     def default(self, obj):
         if isinstance(obj, QuerySet):
             return serializers.serialize("json", obj, ensure_ascii=False)

         return simplejson.JSONEncoder.default(self, obj)

然后我做:simplejson.dumps( dictionary, cls=HandleQuerySets),但是返回的字典看起来像这样:

Then I do: simplejson.dumps( dictionary, cls=HandleQuerySets), but the returned dicionary looks like this:

{ "alfa": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]",
  "beta": "[{\"pk\": 1, \"model\": \"someapp.somemodel\", \"fields\": {\"name\": \"alfa\"}}]" }

Django生成的JSON作为字符串而不是JSON插入到字典中.我在做什么错了?

Django-generated JSON is inserted to the dictionary as string, not JSON. What am I doing wrong?

推荐答案

做到这一点的正确方法是:

The correct way to do this would be:

from django.utils import simplejson
from django.core import serializers
from django.db.models.query import QuerySet

class HandleQuerySets(simplejson.JSONEncoder):
     """ simplejson.JSONEncoder extension: handle querysets """
     def default(self, obj):
         if isinstance(obj, QuerySet):
             return serializers.serialize("python", obj, ensure_ascii=False)
         return simplejson.JSONEncoder.default(self, obj)

因为serializers.serialize("json", [...])返回一个字符串;如果您要求使用python序列化器,则会得到一个字典,并且json对编码器的default方法返回的内容进行编码.有关详细信息,请参见 json文档.

Because serializers.serialize("json", [...]) returns a string ; if you ask for the python serializer, you get a dictionnary, and json encodes whatever is returned by your encoder's default method. Look at the json documentation for details.

您将不得不在编码器类中处理更多类型(例如日期时间对象),但是您会明白的.

You will have to handle more types in your encoder class (such as datetime objects), but you get the idea.

这篇关于序列化包含Django查询集的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆