0

我有一個名爲「邀請」,對現有用戶進行搜索,並創建一個,如果他們不這樣做已經模型存在:Django的REST的框架 - 如何反序列化自定義嵌套場

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 
相關問題