使用序列化器验证自定义 django REST API 视图中的数据

问题描述 投票:0回答:2

我正在尝试构建一个自定义 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 语句来规避这个问题,但这很麻烦、不实用且难以维护。

现在,我知道我可能应该编写一个通用视图,而不是像这样自己构建它。问题是我需要创建一个附加有两个嵌套序列化器的图表,并且在覆盖 create 方法时实现起来非常复杂。因为该图还有两个与之相关的模型,我还为其创建了对象,然后将其添加到图中。粗略地说,就像这样有两个模型:

        new_node = Node.objects.create(
            graph=graph,
            name=data_node["name"],
        )
        new_node.save()

我的具体问题:有没有办法验证数据或在此自定义 API 视图中使用序列化器,以便我不发送的字段填充

None
值?

我的一般问题:假设我使用通用 API 视图,当有两个嵌套序列化器时是否建议覆盖

create
方法,或者该怎么做?

提前非常感谢,非常感谢您的时间、帮助和见解。

django django-rest-framework django-views django-serializer
2个回答
1
投票

是的,您可以使用 DRF 序列化器来验证数据,也可以填充默认值。

假设您有一个序列化器,如下所示,

class FooSerializer(serializers.Serializer):
    foo = serializers.CharField(default='')
    bar = serializers.CharField(default=None)
    foo_bar = serializers.CharField()

此处

foo_bar
字段 id 必需(默认情况下),其余字段也是必需的,但在存在
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
是在Serializer类的
create()
方法中使用的。您可以看到,
foo
bar
字段填充了我们在序列化器定义中提供的
default
值。


假设我使用通用 API 视图,当有两个嵌套序列化器时是否建议覆盖创建方法,或者该怎么做?

我们有两种创建方法,

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

重写序列化器的

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


1
投票
if 'your_key' not in request.data.keys():
    # do whatever you want
© www.soinside.com 2019 - 2024. All rights reserved.