django - 如何使用嵌套对象序列化 Django 模型(Django REST Framework)

标签 django serialization django-rest-framework

如果我有两个序列化程序,其中一个嵌套,我该如何设置 restore_object 方法?例如,如果我定义了以下序列化程序,如何为嵌套序列化程序定义还原对象字段?从文档中看如何处理这种情况并不明显。

class UserSerializer(serializers.Serializer):
    first_name = serializers.CharField(required=True, max_length=30)
    last_name = serializers.CharField(required=True, max_length=30)
    username = serializers.CharField(required=True, max_length=30)
    email = serializers.EmailField(required=True)
    password = serializers.CharField(required=True)

    def restore_object(self, attrs, instance=None):
        if instance:
            instance.first_name = attrs.get('first_name', instance.first_name)
            instance.last_name = attrs.get('last_name', instance.last_name)
            instance.email = attrs.get('email', instance.email)
            instance.password = attrs.get('password', instance.password)

class UserProfileSerializer(serializers.Serializer):
    user = UserSerializer()
    bio = serializers.CharField()
    def restore_object(self, attrs, instance=None):
        if instance:
            instance.bio = attrs.get('bio', instance.bio)
            instance.user = ?????

最佳答案

重要旁注:看起来您正在使用旧的用户/配置文件方法。从 Django 1.5 开始,默认用户和自定义配置文件模型没有分离。您必须创建自己的用户模型并使用它而不是默认模型:Custom User Profile @ Django Docs

序列化

我想向您展示一种不同的方法来序列化和恢复模型。全部 模型对象可以序列化 通过使用以下代码段:

from django.core import serializers
serialized_data = serializers.serialize("json", myInstance)

或到 序列化多个对象 :
serialized_data = serializers.serialize("json", User.objects.all())

然后将外键和 m2m 关系存储在一个 id 数组中。

如果您只想要一个 字段子集 要序列化:
serialized_data = serializers.serialize("json", myUserInstance, fields=('first_name ','last_name ','email ','password '))

要保存用户配置文件,您只需编写:
serialized_data = serializers.serialize("json", myUserProfileInstance)

用户 id 保存在序列化数据中,如下所示:
{
    "pk": 1,
    "model": "profile.UserProfile",
    "fields": {
        "bio": "self-taught couch potato",
        "user": 1
    }
}

如果你想要 序列化中的相关用户字段同样,您需要修改您的用户模型:
class UserManager(models.Manager):
    def get_by_natural_key(self, first_name, last_name):
        return self.get(first_name=first_name, last_name=last_name)

class User(models.Model):
    objects = UserManager()

    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    ...

    def natural_key(self):
        return (self.first_name, self.last_name)

    class Meta:
        unique_together = (('first_name', 'last_name'),)

使用自然键序列化时,您需要添加 use_natural_keys争论:
serialized_data = serializers.serialize("json", myUserProfileInstance, use_natural_keys=True)

这导致以下输出:
{
    "pk": 2,
    "model": "profile.UserProfile",
    "fields": {
        "bio": "time-traveling smartass",
        "user": ["Dr.", "Who"]
    }
}

反序列化

反序列化和保存 就像:
for deserialized_object in serializers.deserialize("json", serialized_data):
    deserialized_object.save()

更多信息可以在 Django 文档中找到:Serializing Django objects

关于django - 如何使用嵌套对象序列化 Django 模型(Django REST Framework),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491008/

相关文章:

json - 如何让 ServiceStack 根据请求序列化动态 (ExpandoObject) 属性

json - django REST框架,验证json数据

java - 在 Retrofit 2 中添加第三个 @Field 时出现 NoSuchMethodError

django - HTML 输入当前不支持列表

python - 如何让 django 管理员更改表单以预选选择字段?

python - ImageField 与 django-storages 导致 : "Error parsing the X-Amz-Credential parameter; the region ' us-east- 1' is wrong; expecting ' us-west- 1'"

python - 没有使用 sys.path.append 命名的模块

python - 无法获取 Django 模板来打印格式化 JSON

java - 如何在Java中序列化不可序列化的?

c# - 如何使用 json.net 反序列化派生类