Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用django rest框架嵌套序列化程序_Python_Django_Serialization_Django Models_Django Rest Framework - Fatal编程技术网

Python 如何使用django rest框架嵌套序列化程序

Python 如何使用django rest框架嵌套序列化程序,python,django,serialization,django-models,django-rest-framework,Python,Django,Serialization,Django Models,Django Rest Framework,我有两种型号的用户和地址。地址模型作为OneToOneField连接到用户模型。在我的例子中,我试图更新用户模型,在初始情况下,用户模型的地址字段为空。所以在第一种情况下,当我更新用户模型时,我想创建一个地址。在其他情况下,只需要更新地址。如何做到这一点 models.py 序列化程序.py views.py 我需要像下面这样离开 { "result ": { "first_name": "Alwin Lazar V", "dp": null,

我有两种型号的用户和地址。地址模型作为OneToOneField连接到用户模型。在我的例子中,我试图更新用户模型,在初始情况下,用户模型的地址字段为空。所以在第一种情况下,当我更新用户模型时,我想创建一个地址。在其他情况下,只需要更新地址。如何做到这一点

models.py 序列化程序.py views.py 我需要像下面这样离开

{
    "result ": {
        "first_name": "Alwin Lazar V",
        "dp": null,
        "gender": null,
        "marital_status": false,
        "dob": null,
        "email": "alwinlazar46@gmail.com",
        "mobile": null,
        "address": null
    }
}
地址字段包含作为响应的地址对象

请求数据格式
名字:阿尔文
性别:m
婚姻状况:假
原始:
街道号码:
路线:
地点:
邮政编码:
声明:
州代码:
国家:
国家/地区代码:

您可以使用嵌套序列化程序并覆盖
更新方法:

序列化程序.py
您可以使用嵌套序列化程序并重写
update
方法:

序列化程序.py
只需编写.create()和.update()函数并手动添加或更新,您能否向我展示一个演示代码…只需编写.create()和.update()函数并手动添加或更新,您能否向我展示一个演示代码…如何使用这种方式传递参数。。。我想在请求中传递raw、city..等参数。我用请求数据格式更新了我的问题。抱歉,当我把{“地址”:{“原始”:“地址行1”,“州”:“喀拉拉邦”}作为《邮差》中的原始尸体传递时,延迟重播。。如果hasattr(实例,地址):TypeError:hasattr():属性名必须是字符串,则在python控制台中显示错误。。。如何克服这个问题如何用这种方法传递参数。。。我想在请求中传递raw、city..等参数。我用请求数据格式更新了我的问题。抱歉,当我把{“地址”:{“原始”:“地址行1”,“州”:“喀拉拉邦”}作为《邮差》中的原始尸体传递时,延迟重播。。如果hasattr(实例,地址):TypeError:hasattr():属性名必须是字符串,则在python控制台中显示错误。。。如何克服这个问题
  class AddressSerializer(ModelSerializer):
    class Meta:
      model = Address
      fields = '__all__'
  class UpdateUserProfileSerializer(ModelSerializer):
    class Meta:
      model = User
      fields = ('first_name', 'dp', 'gender', 'marital_status', 'dob', 'address')
class UserProfileAPIView(APIView):
    serializer_class = UserProfileSerializer
    permission_classes = [IsAuthenticated]

    # Get User Profile
    def get(self, request):
        serializer = UserProfileSerializer(request.user, context={'request': request})
        return Response({'result ': serializer.data},
                        status=status.HTTP_200_OK)


    def patch(self, request):

        user_serializer = UpdateUserProfileSerializer(request.user, data=request.data, context={'request': request})
        if user_serializer.is_valid():
            user_serializer.save()
            return Response({'response': 'Successfully updated', 'result': user_serializer.data},
                            status=status.HTTP_200_OK)
        else:
            return Response(user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
{
    "result ": {
        "first_name": "Alwin Lazar V",
        "dp": null,
        "gender": null,
        "marital_status": false,
        "dob": null,
        "email": "alwinlazar46@gmail.com",
        "mobile": null,
        "address": null
    }
}
first_name: Alwin
gender: m
marital_status: false
raw: <String>
street_number: <String>
route: <String> 
locality: <String>
postal_code: <String>
state: <String>
state_code: <String>
country: <String>
country_code: <String>
class AddressSerializer(ModelSerializer):
  
    class Meta:
       model = Address
       exclude = ('user',)
  

class UpdateUserProfileSerializer(ModelSerializer):
    address = AddressSerializer()
  
    class Meta:
        model = User
        fields = ('first_name', 'dp', 'gender', 'marital_status', 'dob', 'address')

   def update(self, instance, validated_data):
      address = validated_data.pop('address')
      instance = super().update(instance, validated_data)
      if hasattr(instance, 'address'):
         for key, value in address.items():
            setattr(instance.address, key, value)
         instance.address.save()
      else:
          Address.objects.create(user=instance, **address)
      return instance