【问题标题】:DRF: Route with and without argumentsDRF:带参数和不带参数的路由
【发布时间】:2021-04-16 16:00:59
【问题描述】:

我有一个非常简单的 urls.py:

router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet, basename = "product")

urlpatterns = [
    url('^api/', include(router.urls)), ...]

Product 看起来像这样:

class Product(models.Model):
    user = models.ManyToManyField(User, related_name="User", blank = True)
    name = models.CharField('name', max_length=120)

我想要的是一个从用户那里返回产品的视图,如果用户交给它,并在没有用户提交时返回所有产品。我阅读了多个帖子123,但我无法解决。让所有产品都能正常工作:

class ProductViewSet(LoginRequiredMixin, viewsets.ViewSet):
    login_url = "/login/"

    def list(self, request):
        data = [{"products": Product.objects.all(),}]
        results = ProductSerializer(data, many = True).data
        return Response(results)

Serializer.py:

class ProductSerializer(serializers.Serializer):
    products = serializers.CharField(max_length = 120)

我可以向我的ProductViewSet 添加另一种方法吗?如何更改 urls.py 以便我可以调用(对于 Userid=1):

http://127.0.0.1:8002/api/products/1

编辑:例如,answer 建议使用 request.query_params.get('username') 处理请求中的数据,但将数据附加到我的 url 会导致 404。

【问题讨论】:

    标签: django django-rest-framework django-views


    【解决方案1】:

    为了通过 REST API 过滤查询,惯例是使用查询参数。 IE。 /products?user=1 而不是 /product/user/1/product/1

    要实现这一点,你可以做这样的事情,你可以使用 url /products?user=1

    class ProductViewSet(LoginRequiredMixin, viewsets.ViewSet):
        login_url = "/login/"
    
        def list(self, request):
            user_id = request.GET.get('user') #get id from query params, None if not provided
            query = Product.objects.all()
            if user_id:
                query = query.filter(user=user_id)
            data = [{"products": query,}]
            results = ProductSerializer(data, many = True).data
            return Response(results)
    

    更简单,使用django-filter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 2021-07-05
      • 2016-05-09
      • 1970-01-01
      • 2017-07-10
      • 2015-12-10
      • 2017-02-10
      相关资源
      最近更新 更多