Python 在django web API、视图或序列化程序中的何处放置额外逻辑?

Python 在django web API、视图或序列化程序中的何处放置额外逻辑?,python,django,django-rest-framework,django-views,django-serializer,Python,Django,Django Rest Framework,Django Views,Django Serializer,我有一个DRF视图,它扩展了CreateModelMixin和GenericViewSet。在post请求的主体中,我想接受一个额外的字段,它不属于相关模型。然后,我想弹出这个额外的字段,用于其他目的。我不想把那个额外的字段放回http响应,因为它是一个大而复杂的对象。为了更好地解释,这里有一个示例json输入和我想返回给用户的响应: 请求: # request { "name": "Why Nations Fail", "extra_field": { "my_

我有一个DRF视图,它扩展了CreateModelMixin和GenericViewSet。在post请求的主体中,我想接受一个额外的字段,它不属于相关模型。然后,我想弹出这个额外的字段,用于其他目的。我不想把那个额外的字段放回http响应,因为它是一个大而复杂的对象。为了更好地解释,这里有一个示例json输入和我想返回给用户的响应:

请求:

# request
{
    "name": "Why Nations Fail",
    "extra_field": {
        "my_keys": ["I'm", "a", "very", "big", "array", "object.", "..."]
    }
}
答复:

# response
{
    "id": 120
    "name": "Why Nations Fail"
}
我的问题是,我不能决定在哪里做这个弹出这个额外的_字段;在视图或序列化程序(扩展ModelSerializer)中。目前,我通过扩展视图的
create
方法处理程序实现了这一点。但是根据我读过的书和教程:

我们应该保持我们的观点清晰,序列化程序清晰

记住这一点,我曾尝试在序列化程序中弹出该字段,但我无法做到这一点,我认为这是因为我使用的ModelSerializer在验证不存在的模型字段时出现错误

到目前为止我所做的:

目前,我通过扩展视图的
create
来弹出这个额外的_字段,如下所示:

#models.py
教材(models.Model):
name=models.CharField(最大长度=255)
#serializers.py
类BookSerializer(serializers.ModelSerializer):
类元:
模型=书
字段='\uuuu所有\uuuu'
#views.py
类BookViewSet(mixins.CreateModelMixin,viewsets.GenericViewSet):
queryset=Book.objects.all()
serializer_class=图书序列化程序
def创建(self、request、*args、**kwargs):
#请注意,我弹出的是额外字段,而不是获取。
额外字段=request.data.pop(“额外字段”)
用额外字段(额外字段)做某事
serializer=self.get\u序列化程序(data=request.data)
serializer.is\u有效(raise\u exception=True)
self.perform\u创建(序列化程序)
headers=self.get\u success\u头(serializer.data)
返回响应(
serializer.data,
status=status.HTTP_201_已创建,
标题=标题
)
到目前为止,这个解决方案完全满足了我的需要

我有3个问题:

  • 应该在视图中或序列化程序中弹出
    extra_字段
    ?在我看来,我的序列化程序与此逻辑无关,但是“瘦视图,厚序列化程序”后来又发生了什么
  • 如果我在视图中这样做,我当前的实现是否正确?扩展视图的
    create
    handler方法是一种好方法吗
  • 如果我应该在序列化程序中这样做,那么我该如何做呢

  • 这个问题没有单一的答案。如果有什么取决于
    用额外字段做什么
    ;如果它与创建对象有关,那么它属于序列化程序。不,它与创建模型对象无关。这只是一个额外的领域,需要用于其他目的。我不知道你为什么这么关心一个模糊的指导方针。把它放在有意义的地方。视图中的额外调用并不能使其变得“厚”。扩展视图的
    create
    如何。这是一种安全的方法吗?看,这个问题没有单一的答案。如果有什么取决于
    用额外字段做什么
    ;如果它与创建对象有关,那么它属于序列化程序。不,它与创建模型对象无关。这只是一个额外的领域,需要用于其他目的。我不知道你为什么这么关心一个模糊的指导方针。把它放在有意义的地方。视图中的额外调用并不能使其变得“厚”。扩展视图的
    create
    如何。这是一种安全的方法吗