如何在django中序列化单个对象的字段(没有pk和模型)

时间:2014-04-21 12:01:27

标签: python json django serialization

在Django中,我有这个模型(它继承自AbstractBaseUser):

class User(AbstractBaseUser):
    username = models.CharField(max_length=20, unique=True)
    realname = models.CharField(max_length=10)
    grade = models.CharField(max_length=10)
    studentNo = models.CharField(max_length=10)
    email = models.EmailField()
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

我想将单个User对象序列化为:

{
    "studentNo": "lu", 
    "realname": "lu", 
    "email": "admin@admin.com", 
    "grade": "lu", 
    "username": "admin", 
    "is_active": true
}

有序列化的实用程序吗?


我找到了the document形式的django。按照文档进行操作,它只能序列化列表,并且必须使用modelpk。它是这样的:

[
    {
        "fields": {
            "email": "admin@admin.com", 
            "is_active": true, 
            "studentNo": "lu", 
            "username": "admin", 
            "realname": "lu", 
            "grade": "lu"
        }, 
        "pk": 1, 
        "model": "account.user"
    }
]

我也尝试了内置模块json,但我必须获取每个字段的键和值,保存到列表并序列化它。它看起来并不优雅。

3 个答案:

答案 0 :(得分:2)

您可以像这样创建自定义Serializer

from django.core.serializers.json import Serializer, DjangoJSONEncoder
from django.utils import simplejson

class NewSerializer(Serializer):
    def end_serialization(self):
        cleaned_objects = []

        for obj in self.objects:
            del obj['pk']
            del obj['model'] 
            cleaned_objects.append(obj)

        simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options)

答案 1 :(得分:0)

我有另一种方法可以做到这一点

import json
from models import User

UserList = [ {"studentNo": user.studentNo, "realname": user.realname, "email": user.email, "grade": user.grade,
    "username": user.username, "is_active": user.is_active } for user in User.objects.all()]

f = open('jsonfile.txt','w')
json.dump(UserList,f,indent=4) # elegant output
f.close()

答案 2 :(得分:0)

from django.core.serializers.json import Serializer
class CustomSerializer(Serializer):
    def get_dump_object(self, obj):
        return self._current

我在新的Django版本中使用它