我正在 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 问题,所以我也希望得到一些对此的反馈。
(第一个问题)我认为这两种方法都可以。如果您想对产品使用一个端点(有或没有类别),那么您应该像这样实现:
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 来获取多种数据,这对我来说听起来没问题。