我正在尝试构建一个自定义 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
方法,或者该怎么做?
提前非常感谢,非常感谢您的时间、帮助和见解。
是的,您可以使用 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 视图,当有两个嵌套序列化器时是否建议覆盖创建方法,或者该怎么做?
我们有两种创建方法,
create()
viewsets.ModelViewSet
create()
serializer.Serializer
(或其子类)的方法重写序列化器的
create()
方法是处理 可写嵌套序列化器的 DRF 方法。
if 'your_key' not in request.data.keys():
# do whatever you want