模型、视图或序列化程序是否代表 Django Rest Framework 中的 REST 资源?

Does the model, the view or the serializer represent a REST resource in Django Rest Framework?

我正在使用 Django Rest Framework 构建一个 API,并且我正在努力使其尽可能 RESTful。在 this question (and also this question on SoftwareEngineering) 之后,我描述了我的 API 端点将公开的一些资源,例如可以在以下 URL 中看到的 Invoice/api/v1/invoices/<invoicenumber>/

但是,我无法将 RESTful 设计原则与 Django Rest Framework 的具体工作联系起来。我不清楚什么构成了资源:模型、序列化器还是视图?

特别是,我对实施 calculate_total() 方法的正确位置感到困惑。在常规 Django 应用程序中,它肯定存在于 Invoice 模型中:

class InvoiceModel(models.Model):
    def calculate_total(self):
         # do calculation
         return total

尽管实际计算可能很复杂,但“总计”在概念上是发票表示 的一部分。从这个意义上说,资源更等同于 InvoiceSerializer:

class InvoiceSerializer(serializers.Serializer):
    total = serializers.SerializerMethodField()

    def get_total(self, obj):
        # do calculation
        return total

最后,视图将始终访问资源。所以你也可以争辩说视图实际上是资源,而序列化器和模型只是实现细节:

class InvoiceView(APIView):
    def calculate_total(self, obj):
        # do calculation
        return total

如果我必须指定上述 class 之一作为发票的规范表示 作为资源 ,我会指定哪一个?我应该在模型 class、序列化器 class 还是视图 class 上实现我的方法?或许我想多了,他们中的任何一个都可以吗?

好吧,虽然我同意可能有不同的解决方案,但在这种情况下,我肯定会选择该模型。作为资源和放置功能的地方。

在函数的情况下,它甚至可以作为发票的计算属性来实现。实际上,对我来说 TOTAL 更像是一个属性而不是一个方法。

无论如何,我觉得你的思路以及你如何获得其他两个选项(序列化程序和视图)很有趣。

我认为模型它绝对是一种资源。在这种情况下,发票资源就是模型。所以我想说您的 API 将要发布的每个模型都是一种资源。

我还认为只要资源与单个模型没有直接关系,视图就可以被视为资源。

现在,序列化程序对我来说是个谜。我想不出可以将其视为资源的情况。