[英]Django-Rest-Framework - How to Deserialize Custom Nested Field
I have a model called 'Invite' that searches for an existing user and creates one if they do not already exist: 我有一个名为“邀请”的模型,该模型搜索现有用户并在不存在的情况下创建一个:
from django.contrib.gis.db import models
from users.models import CustomUser
class Hangout(models.Model):
name = models.CharField(max_length=255)
class InviteManager(models.Manager):
def create_invite(self, hangout, phone):
(user, did_create) = CustomUser.objects.get_or_create(phone=phone)
invite = self.create(status=status, hangout=hangout, arrival_time=arrival_time, user=user)
return invite
class Invite(models.Model):
hangout = models.ForeignKey(Hangout, on_delete=models.CASCADE, related_name='invites')
user = models.ForeignKey(CustomUser)
objects = InviteManager()
I am having a lot of trouble deserializing it. 反序列化时遇到很多麻烦。 I'd like to create a hangout with nested invites with this post request: 我想通过此发布请求创建带有嵌套邀请的视频群聊:
{ 'name': 'Bobs House',
'invites': [
{ 'phone': '5127914819', 'name': 'Bob1' },
{ 'phone': '0000000000', 'name': 'Bob2' },
{ 'phone': '0000000001', 'name': 'Bob3' },
{ 'phone': '0000000002', 'name': 'Bob3' },
{ 'phone': '0000000003', 'name': 'Bob4' }
]
}
I want the Invite serializer to check that phone exists and is 10 digits long. 我希望邀请序列化程序检查电话是否存在并且长度为10位。 I am having a lot of trouble setting up a sequence of serializers to work. 我在设置一系列序列化程序工作时遇到很多麻烦。 I have tried combinations of the solutions here and here , but the combination of nested deserializers and custom create fields that are not on the model at all is driving me nuts. 我在这里和这里都尝试过解决方案的组合,但是嵌套解串器和自定义创建字段的组合根本不在模型上,这让我发疯了。 Any help is much appreciated! 任何帮助深表感谢! Thanks 谢谢
I ended up using an serializer with different fields than those on the model. 我最终使用了序列化程序,其字段与模型字段不同。 Here is the working code in case it helps someone: 如果可以帮助某人,以下是工作代码:
from rest_framework import serializers
from . import models
from users.models import CustomUser
class InviteSerializer(serializers.ModelSerializer):
phone = serializers.CharField()
name = serializers.CharField(required=False)
class Meta:
extra_kwargs = { 'name': { 'read_only': True },
'phone': { 'read_only': True }}
fields = (
'phone',
'name',
)
model = models.Invite
def validate(self, data):
return data
def create(self, validated_data):
phone = validated_data.pop('phone')
name = validated_data.pop('name', None)
(user, did_create) = CustomUser.objects.get_or_create(phone=phone)
if (user.display_name is None) and (name is not None):
user.display_name = name
user.save()
instance = self.Meta.model.objects.create(user=user, hangout=validated_data['hangout'])
instance.save()
class HangoutSerializer(serializers.ModelSerializer):
name = serializers.CharField(required=True)
invites = InviteSerializer(many=True)
class Meta:
extra_kwargs = { 'phones': {'write_only': True, 'required': True } }
fields = (
'invites',
'name',
)
model = models.Hangout
def create(self, validated_data):
invites_data = validated_data.pop('invites')
instance = self.Meta.model(**validated_data)
instance.save()
serializer = InviteSerializer(data=invites_data, many=True)
if serializer.is_valid(raise_exception=True):
invites = serializer.save(hangout=instance)
return instance
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.