模型、视图或序列化程序是否代表 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 将要发布的每个模型都是一种资源。
我还认为只要资源与单个模型没有直接关系,视图就可以被视为资源。
现在,序列化程序对我来说是个谜。我想不出可以将其视为资源的情况。
我正在使用 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 将要发布的每个模型都是一种资源。
我还认为只要资源与单个模型没有直接关系,视图就可以被视为资源。
现在,序列化程序对我来说是个谜。我想不出可以将其视为资源的情况。