首页 > 解决方案 > Django Rest Framework:我应该使用 URL Slugs 还是查询参数来列出特定类别的项目?

问题描述

现在我有一个视图集,它允许我:

  1. 列出所有产品:www.example.com/api/products
  2. 在以下位置检索一种产品的详细信息:www.example.com/api/products/5

问题在于,在移动应用程序中,只有当您位于类别和子类别中时,产品才会可见。

产品模型如下所示:

class Product(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    image = models.CharField(max_length=255)
    category = models.ForeignKey(ProductCategory, related_name='products', on_delete=models.CASCADE)
    subcategory = models.ForeignKey(ProductSubcategory, related_name='products', on_delete=models.CASCADE)

产品 Viewset 如下所示:

class RoutineViewSet(mixins.ListModelMixin,
                     mixins.RetrieveModelMixin,
                     viewsets.GenericViewSet):

    queryset = models.Product.objects.all()   

    def get_serializer_class(self):
        if self.action == 'list':
            return serializers.ProductListSerializer
        else:
            return serializers.ProductDetailSerializer

我应该在端点中使用 slug 或 ID 来获取项目吗?

www.example.com/api/products/category/food/subcategory/snacks
www.example.com/api/products/category/2/subcategory/3

或者我应该使用查询参数?

www.example.com/api/products/?category=2,subcategory=3

我的直觉告诉我,最简单的方法是使用查询参数并覆盖“get_queryset”方法,以根据查询参数获取不同的产品。但我不确定这是否是做这样的事情的标准方式。

谢谢

标签: pythondjangodjango-rest-framework

解决方案


您应该使用 detail=True 在您的视图中定义子类别 @action


推荐阅读