Python 如何使用django rest框架嵌套序列化程序
我有两种型号的用户和地址。地址模型作为OneToOneField连接到用户模型。在我的例子中,我试图更新用户模型,在初始情况下,用户模型的地址字段为空。所以在第一种情况下,当我更新用户模型时,我想创建一个地址。在其他情况下,只需要更新地址。如何做到这一点 models.py 序列化程序.py views.py 我需要像下面这样离开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,
{
"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