【问题标题】:How can I serialize single object's fields in django(without pk and model)如何在 django 中序列化单个对象的字段(没有 pk 和模型)
【发布时间】:2014-04-21 12:01:26
【问题描述】:

在 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 中找到了 the document。按照cocument,它只能序列化一个列表,并且必须带有modelpk。是这样的:

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

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

【问题讨论】:

    标签: python json django serialization


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这样,字段在项目中出现了两次(models.py和这段代码)。我认为这是重复自己
    • 是的,你是对的,但这是实现你想要什么的更简单的方法。显然,Adem Öztaş 的答案更好。
    【解决方案3】:
    from django.core.serializers.json import Serializer
    class CustomSerializer(Serializer):
        def get_dump_object(self, obj):
            return self._current
    

    我在新的 Django 版本中使用它

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 2019-07-11
      相关资源
      最近更新 更多