Python Django Rest框架-如何反序列化自定义嵌套字段

Python Django Rest框架-如何反序列化自定义嵌套字段,python,django,serialization,django-rest-framework,deserialization,Python,Django,Serialization,Django Rest Framework,Deserialization,我有一个名为“Invite”的模型,该模型搜索现有用户,并在用户不存在时创建一个用户: 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

我有一个名为“Invite”的模型,该模型搜索现有用户,并在用户不存在时创建一个用户:

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()
我在反序列化它时遇到了很多麻烦。我想使用此帖子请求创建一个包含嵌套邀请的聚会:

{ 'name': 'Bobs House',
  'invites': [
             { 'phone': '5127914819', 'name': 'Bob1' },
             { 'phone': '0000000000', 'name': 'Bob2' },
             { 'phone': '0000000001', 'name': 'Bob3' },
             { 'phone': '0000000002', 'name': 'Bob3' },
             { 'phone': '0000000003', 'name': 'Bob4' }
             ]
}

我希望邀请序列化程序检查电话是否存在,长度是否为10位数。我在设置序列化程序序列时遇到了很多麻烦。我尝试了解决方案和的组合,但是嵌套反序列化器和自定义创建字段的组合根本不在模型上,这让我发疯。非常感谢您的帮助!谢谢

我最终使用了一个与模型上的字段不同的序列化程序。以下是工作代码,以防它帮助某人:

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

我最终使用了一个与模型上的字段不同的序列化程序。以下是工作代码,以防它帮助某人:

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