使用序列化程序验证自定义 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()方法中使用的。您可以看到,foobar 字段填充了我们在序列化程序定义中提供的 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?

我们有两种创建方法,

  1. create() viewsets.ModelViewSet
  2. 的方法
  3. create() serializer.Serializer(或其子classes)
  4. 的方法

覆盖序列化器的create()方法是DRF处理可写嵌套序列化器.

的方法

如果 'your_key' 不在 request.data.keys() 中:
# 随心所欲