gpt4 book ai didi

python - Django 序列化器 : How can I validate a model instance?

转载 作者:行者123 更新时间:2023-12-02 20:16:23 25 4
gpt4 key购买 nike

我对 Django 序列化器还很陌生,但仍然对它们的工作原理感到困惑。

我有一个相当一般的场景,其中我调用我的 api,它只是在我的模型对象中设置一个字段并保存它(假设记录已经存在并且刚刚更新)。但是,我需要在保存之前验证该模型对象。

api.py

@detail_route(methods=['POST'], url_path='submit-draft')
def submit_draft(self, request, *args, **kwargs):
booking = self.get_object()

# serializer with custom validations.
serializer = self.get_serializer(booking)
serializer.is_valid(raise_exception=True)

booking.submit_draft(by=request.user)
booking.save()

data = serializers.BookingDetailSerializer(booking, context={'request': request}).data

return response.Ok(data)

序列化器.py

class BookingCreateUpdateSerializer(serializers.ModelSerializer):
date = serializers.CharField()

duration = serializers.IntegerField(required=True, )

created_by = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault(), )

modified_by = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault(), )
....

class Meta:
model = models.Booking
fields = [
'title',
'date',
'duration',
'client',
'created_by',
'modified_by',
....
]

但是,我收到此错误:

断言错误:无法调用“.is_valid()”,因为在实例化序列化器实例时未传递“data=”关键字参数。

我知道序列化器需要一个字典而不是实际的模式对象。但我不知道如何实现我想要的目标。验证模型对象。谁能建议正确的方法吗?

最佳答案

您可以使用序列化器来:

1) 将对象序列化到字典中。在这种情况下,您不需要调用 is_valid,因为对象已经创建并且具有有效值。因此您可以执行以下操作:

serializer = BookingCreateUpdateSerializer(booking)

return Response(serializer.data)

2) 序列化输入并使用序列化器创建新对象。在这种情况下,输入是一个字典,在调用保存之前需要先对其进行验证。你可以这样做:

serializer = BookingCreateUpdateSerializer(data=input_dict)
serializer.is_valid()
serializer.save()

更新以回答评论

您可以执行以下操作来使用序列化程序更新实例:

serializer = BookingCreateUpdateSerializer(booking, data=input_data_to_update, partial=True)
serializer.is_valid()

instance = serializer.save()

# and serialize the updated instance for response using another serializer
output_data = BookingDetailSerializer(instance).data

关于python - Django 序列化器 : How can I validate a model instance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52309584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com