如何组织 Django REST Framework url

问题描述 投票:0回答:1

我正在 Django (DRF) 中开发一些虚拟电子商务应用程序,我有点困惑如何编写良好的 REST API。

型号

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

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

观点

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)
第一个问题

所以我的问题是我是否应该在此视图中放置使用捕获值(

categori_slug
)进行过滤的逻辑,或者如果我创建两个端点会更清晰吗?

第二个问题

在 DRF 中,底部代码是通过结果/端点发送多个数据的良好实践吗?

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

因此,正如我一直在学习的那样,只有一个

serializer.data
通过一个响应 API 传递,但如果我希望客户端也可以访问一些其他数据怎么办?将其拆分为多个视图而不是让客户端发出多个请求更好吗?

PS:这是我的第一个 Stack Overflow 问题,所以我也希望得到一些对此的反馈。

django rest django-rest-framework api-design
1个回答
2
投票

(第一个问题)我认为这两种方法都可以。如果您想对产品使用一个端点(有或没有类别),那么您应该像这样实现:

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)

然后你需要像这样调用api:

http://localhost:8000/products/?category_slug=XXXX

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

© www.soinside.com 2019 - 2024. All rights reserved.