0

をデシリアライズするためにはどのように既存のユーザーを検索し、それらがまだ存在しない場合は、1つを作成し、「招待」と呼ばれるモデルがあります:ジャンゴ・休憩・フレームワーク - カスタムネストされたフィールド

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桁の長さであることを確認するために招待シリアライザをしたいです。私は一連のシリアライザを動作させるために多くの問題を抱えています。私は、ソリューションherehereの組み合わせを試しましたが、ネストされたデシリアライザとカスタム作成フィールドの組み合わせは、モデルにはまったくありません。どんな助けでも大歓迎です!ありがとう

答えて

0

私は、モデルとは異なるフィールドを持つシリアライザを使用しました。誰かを助ける場合の作業コードは次のとおりです。

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 
関連する問題