use*_*508 8 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 = ?????
Run Code Online (Sandbox Code Playgroud)
Alp*_*Alp 23
重要的旁注: 看起来您使用的是旧用户/配置文件方法.由于Django 1.5没有默认用户和您的自定义配置文件模型的分离.您必须创建自己的用户模型并使用它而不是默认用户模型: 自定义用户配置文件@Django Docs
我想为您提供一种序列化和恢复模型的不同方法.可以使用以下代码序列化所有模型对象:
from django.core import serializers
serialized_data = serializers.serialize("json", myInstance)
Run Code Online (Sandbox Code Playgroud)
或序列化多个对象:
serialized_data = serializers.serialize("json", User.objects.all())
Run Code Online (Sandbox Code Playgroud)
然后将外键和m2m关系存储在id数组中.
如果只想序列化一部分字段:
serialized_data = serializers.serialize("json", myUserInstance, fields=('first_name ','last_name ','email ','password '))
Run Code Online (Sandbox Code Playgroud)
要保存用户配置文件,您只需编写:
serialized_data = serializers.serialize("json", myUserProfileInstance)
Run Code Online (Sandbox Code Playgroud)
用户标识保存在序列化数据中,如下所示:
{
"pk": 1,
"model": "profile.UserProfile",
"fields": {
"bio": "self-taught couch potato",
"user": 1
}
}
Run Code Online (Sandbox Code Playgroud)
如果您也想要序列化中的相关用户字段,则需要修改用户模型:
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'),)
Run Code Online (Sandbox Code Playgroud)
使用自然键进行序列化时,需要添加use_natural_keys参数:
serialized_data = serializers.serialize("json", myUserProfileInstance, use_natural_keys=True)
Run Code Online (Sandbox Code Playgroud)
这导致以下输出:
{
"pk": 2,
"model": "profile.UserProfile",
"fields": {
"bio": "time-traveling smartass",
"user": ["Dr.", "Who"]
}
}
Run Code Online (Sandbox Code Playgroud)
反序列化和保存就像以下一样简单:
for deserialized_object in serializers.deserialize("json", serialized_data):
deserialized_object.save()
Run Code Online (Sandbox Code Playgroud)
可以在Django文档中找到更多信息:序列化Django对象
| 归档时间: |
|
| 查看次数: |
17248 次 |
| 最近记录: |