使用序列化程序验证自定义 django REST API 视图中的数据
Using a serializer to validate data in a custom django REST API view
我正在尝试构建一个自定义 API 视图,但我偶然发现了 2 个问题,一个更笼统,另一个更具体:
我有一个自定义视图,我在其中根据 api-请求中发送的数据创建了一个对象:
@api_view(["POST"])
def graph_create_view(request):
"""
"""
network = Network.objects.get(name=request.data["network"])
graph = Graph.objects.create(
network_id=network.id,
name=request.data["name"],
description=request.data["description"],
field2==request.data["field"],
field3==request.data["field"],
field4==request.data["field"],
field5==request.data["field"],
field6==request.data["field"],
field7==request.data["field"],
graph.save()
return Response(HttpResponse.status_code)
当我发送 Graph.objects.create 方法中指定的所有数据时,效果很好。当我没有发送所有数据但遗漏了一个字段时(假设我发送了没有描述字段的示例数据),我收到 key
-错误。这是有道理的,因为那把钥匙实际上不见了。我可以用许多 if-else-statements 来规避这个问题,但这很麻烦,不实用且难以维护。
现在,我知道我可能应该编写一个通用视图,而不是像这样自己构建它。问题是我需要创建一个带有两个嵌套序列化程序的图形,并且在覆盖创建方法时实现起来非常复杂。因为该图还有两个与之相关的模型,我也为其创建对象,然后将其添加到图中。粗略地说,像这样有两个模型:
new_node = Node.objects.create(
graph=graph,
name=data_node["name"],
)
new_node.save()
我的具体问题:是否有一种方法可以验证数据或在此自定义 API-view 中使用序列化程序,以便我不发送的字段填充 None
-values ?
我的一般问题:假设我使用通用的 API-view,当有两个嵌套的序列化器时,是否建议覆盖 create
-method 或者什么是方法?
在此先致谢,非常感谢您抽出宝贵的时间、帮助和见解。
是的,您可以使用 DRF 序列化程序来验证数据,也可以填充默认值。
假设你有一个如下的序列化器,
class FooSerializer(serializers.Serializer):
foo = serializers.CharField(default='')
bar = serializers.CharField(default=None)
foo_bar = serializers.CharField()
此处foo_bar
字段id required(默认情况下),其余字段也是必需的,但存在default
个 DRF 将修补 default
个值。
In [2]: s = FooSerializer(data={'foo_bar': 'This is foo_bar'})
In [3]: s.is_valid()
Out[3]: True
In [4]: s.validated_data
Out[4]: OrderedDict([('foo', ''), ('bar', None), ('foo_bar', 'This is foo_bar')])
这里.validated_data
是在Serializerclass的create()
方法中使用的。您可以看到,foo
和 bar
字段填充了我们在序列化程序定义中提供的 default
值。
Assuming I'd use a generic API-view, is it recommendable to overwrite the create-method when having two nested serializers or what would be the way to go?
我们有两种创建方法,
create()
viewsets.ModelViewSet
的方法
create()
serializer.Serializer
(或其子classes) 的方法
覆盖序列化器的create()
方法是DRF处理可写嵌套序列化器.
的方法
如果 'your_key' 不在 request.data.keys() 中:
# 随心所欲
我正在尝试构建一个自定义 API 视图,但我偶然发现了 2 个问题,一个更笼统,另一个更具体:
我有一个自定义视图,我在其中根据 api-请求中发送的数据创建了一个对象:
@api_view(["POST"])
def graph_create_view(request):
"""
"""
network = Network.objects.get(name=request.data["network"])
graph = Graph.objects.create(
network_id=network.id,
name=request.data["name"],
description=request.data["description"],
field2==request.data["field"],
field3==request.data["field"],
field4==request.data["field"],
field5==request.data["field"],
field6==request.data["field"],
field7==request.data["field"],
graph.save()
return Response(HttpResponse.status_code)
当我发送 Graph.objects.create 方法中指定的所有数据时,效果很好。当我没有发送所有数据但遗漏了一个字段时(假设我发送了没有描述字段的示例数据),我收到 key
-错误。这是有道理的,因为那把钥匙实际上不见了。我可以用许多 if-else-statements 来规避这个问题,但这很麻烦,不实用且难以维护。
现在,我知道我可能应该编写一个通用视图,而不是像这样自己构建它。问题是我需要创建一个带有两个嵌套序列化程序的图形,并且在覆盖创建方法时实现起来非常复杂。因为该图还有两个与之相关的模型,我也为其创建对象,然后将其添加到图中。粗略地说,像这样有两个模型:
new_node = Node.objects.create(
graph=graph,
name=data_node["name"],
)
new_node.save()
我的具体问题:是否有一种方法可以验证数据或在此自定义 API-view 中使用序列化程序,以便我不发送的字段填充 None
-values ?
我的一般问题:假设我使用通用的 API-view,当有两个嵌套的序列化器时,是否建议覆盖 create
-method 或者什么是方法?
在此先致谢,非常感谢您抽出宝贵的时间、帮助和见解。
是的,您可以使用 DRF 序列化程序来验证数据,也可以填充默认值。
假设你有一个如下的序列化器,
class FooSerializer(serializers.Serializer):
foo = serializers.CharField(default='')
bar = serializers.CharField(default=None)
foo_bar = serializers.CharField()
此处foo_bar
字段id required(默认情况下),其余字段也是必需的,但存在default
个 DRF 将修补 default
个值。
In [2]: s = FooSerializer(data={'foo_bar': 'This is foo_bar'})
In [3]: s.is_valid()
Out[3]: True
In [4]: s.validated_data
Out[4]: OrderedDict([('foo', ''), ('bar', None), ('foo_bar', 'This is foo_bar')])
这里.validated_data
是在Serializerclass的create()
方法中使用的。您可以看到,foo
和 bar
字段填充了我们在序列化程序定义中提供的 default
值。
Assuming I'd use a generic API-view, is it recommendable to overwrite the create-method when having two nested serializers or what would be the way to go?
我们有两种创建方法,
create()
viewsets.ModelViewSet
的方法
create()
serializer.Serializer
(或其子classes) 的方法
覆盖序列化器的create()
方法是DRF处理可写嵌套序列化器.
如果 'your_key' 不在 request.data.keys() 中:
# 随心所欲