在注册用户期间,我希望在一次api调用中同时创建User对象和EmailContact对象。不应链接这两个对象。 我有以下序列化器:
class RegistrationSerializer(serializers.Serializer):
userserializer=UserAccountSerializer() #reuse existing modelserializer
emailcontactserializer=EmailContactSerializer() #reuse existing modelserializer
def create(self, validated_data):
emailcontact_data = validated_data.pop('emailcontactserializer')
user_data = validated_data.pop('userserializer')
emailcontact= EmailContact.objects.create(**emailcontact_data)
user= User.objects.create(**user_data)
return user
以及以下Apiview:
class RegistrationAPIView(APIView):
permission_classes = (AllowAny,)
serializer_class = RegistrationSerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我得到的错误如下(发生在serializer.save()之后):
/ api / register 中的AttributeError
尝试在序列化程序userserializer
上获取字段RegistrationSerializer
的值时出现AttributeError。
序列化程序字段可能名称不正确,并且与User
实例上的任何属性或键都不匹配。
原始异常文本是:'User'对象没有属性'userserializer'。
答案 0 :(得分:1)
在RegistrationSerializer.create()
方法中,您将返回User
个对象。序列化程序将尝试将该对象序列化为此表示形式:
{
'userserializer': x,
'emailcontactserializer': y
}
但它抱怨,因为您返回的用户没有userserializer
字段。
如果你真的想从这个API调用中返回一个用户,你可以使用Meta.model = User将RegistrationSerializer作为ModelSerializer,并覆盖perform_create
以弹出emailcontact_data
。 (我将字段命名为RegistrationSerializer.email_contact
以使表示更清晰,IMO短语"序列化程序"不应出现在API的客户端可见部分上)
或者,如果要渲染两个子序列化程序,可以通过传入数据在RegistrationSerializer.create
中创建RegistrationSerializer实例,例如
return RegistrationSerializer(data={'emailcontactserializer':
emailcontact_data, 'userserializer': user_data})