如何在Django中序列化单个对象的字段(不包括pk和模型)

0 投票
3 回答
1897 浏览
提问于 2025-04-18 03:35

在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)

我想把一个单独的用户对象序列化成:

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

有没有什么工具可以用来序列化呢?


我找到了一份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
from django.core.serializers.json import Serializer
class CustomSerializer(Serializer):
    def get_dump_object(self, obj):
        return self._current

我在新的Django版本中使用这个

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

你可以像这样创建自定义的 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)

撰写回答