因此,我正在用Django(DRF)开发一些虚拟的Electron 商务应用程序,我对如何编写好的REST API感到有点困惑.

Models

class Category(models.Model):
    name = models.Char...

class Product(models.Model):
    category = models.ForeignKey(...)
    name = models.Char...

Views

class ProductListView(APIView):
    def get(self, request, category_slug=None):
        products = Product.objects.filter(available=True)
        if category_slug:
            category = get_object_or_404(Category, slug=category_slug)
            products = products.filter(category=category)
        serializer = ProductSerializer(products, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
First Question

因此,我的问题是,我是否应该将带有捕获值(Categori_Slug)的过滤逻辑放在这个视图中,或者如果我创建两个端点会不会更清楚?

Second Question

在DRF中,通过结果/端点发送多个数据的底层代码是不是很好的做法?

return Response({data: serializer.data, other_data: serializer_other.data}, status=st...)

因此,正如我一直在学习的那样,通过一个响应API只传递一个序列化程序.data,但如果我希望该客户端还可以访问其他一些数据,该怎么办?将其拆分到多个视图中比让客户端发出多个请求更好吗?

PS: This is my first Stackoverflow question so I would appreciate some feedback on this as well.

推荐答案

(第一个问题)我认为这两种方法都可以.如果您想要对产品使用一个终结点(带或不带类别),那么您应该这样实现:

class ProductListView(APIView):
    def get(self, request):
        products = Product.objects.filter(available=True)
        category_slug = request.GET.get('category', None)
        if category_slug:
            products = products.filter(category__slug=category_slug)
        serializer = ProductSerializer(products, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

然后需要这样调用接口:http://localhost:8000/products/?category_slug=XXXX.

(第二个问题)对于数据部分,我认为一个视图或一个URL应该返回一种数据.因此,产品URL应该返回产品数据.如果客户端必须调用多个API来获取多种数据,对我来说听起来没问题.

Django相关问答推荐

Django modelform在包含在另一个模板中时不呈现

在生成的表单元素处出现多值DictKeyError

如何在Django模板中为无效词典查找打开异常?

Django 根据子级过滤父级

DjangoRestFramework 解析错误:"多部分表单解析错误多部分中的无效边界:None"

如何连接到 docker 容器中的 postgres 数据库?

django 创建多种类型用户的最佳方法

当我告诉它时,如何使用 Django 的记录器来记录回溯?

django - 表单没有错误,但 form.is_valid() 没有验证

如何从 json 模式创建表单?

django 用一个提交按钮提交两种不同的表单

Django 从字段开始

Django: Admin:在管理员中更改字段的小部件

如何在python中遍历httprequest post变量

如何使用 django-nose 运行单个测试或单个 TestCase?

Django ALLOWED_HOSTS IP 范围

模拟 Django 查询集以测试采用查询集的函数

Django - 在设置中使用反向 url 映射

Django 中的自定义 HTTP 标头

Django:必须使用对象 pk 或 slug 调用通用详细视图