【问题标题】:django rest framework: Get url path variable in a viewdjango rest框架:在视图中获取url路径变量
【发布时间】:2017-09-15 05:57:24
【问题描述】:

我必须将product_id(它是一个字符串)传递到一个视图中。在那里,我必须根据产品 ID 进行一些数据库操作。如何在该视图中获取该产品 ID?实际上,ProductDetailConfiguration 视图中的参数应该是什么?现在我通过viewsets.ModelViewSet。实际上,这个 API 调用与任何模型都不完全相关。

# urls.py

  url(r'^product-configuration/(?P<product_id>[\w-]+)/$', views.ProductDetailConfiguration, name='product-configuration'),

#views.py

class ProductDetailConfiguration(viewsets.ModelViewSet):

    queryset = Product.objects.all()

    def get_queryset(self, **kwargs):
      
        queryset = Product.objects.all()
        product_id = self.request.get('product_id', None)
        #filter query set based on the product_id
        return queryset

    serializer_class = ProductConfigurationSerializer

【问题讨论】:

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


    【解决方案1】:

    网址参数在self.kwargs中可用。
    来自the documentation

    过滤 URL

    另一种过滤方式可能涉及根据 URL 的某些部分限制查询集。

    例如,如果您的 URL 配置包含这样的条目:

    url('^purchases/(?P<username>.+)/$', PurchaseList.as_view()),
    

    然后您可以编写一个视图,该视图返回由 URL 的用户名部分过滤的购买查询集:

    class PurchaseList(generics.ListAPIView):
       serializer_class = PurchaseSerializer
    
       def get_queryset(self):
           """
           This view should return a list of all the purchases for
           the user as determined by the username portion of the URL.
           """
           username = self.kwargs['username']
           return Purchase.objects.filter(purchaser__username=username)
    

    【讨论】:

    • self.kwargs['param'] -> 这是正确的答案
    【解决方案2】:

    您必须在视图中使用lookup_field 才能获得product_id,并且该视图不应属于任何模型。在这里我已经回答了像你这样的问题using django rest framework to return info by name

    希望这将有助于解决您的问题。

    【讨论】:

    • 我已经按照你在那个问题中的建议实施了。当我在视图中打印查询集时,它会显示结果。 ProductConfigurationCustomSerializer(queryset)。那么序列化程序中的模型应该是什么。当我评论模型引用时,它会引发错误。
    • 其实你想做什么?在您的问题中,您只是要求在视图中获取 product_id。
    【解决方案3】:

    这是我的方法:

    更新网址:

    url(r'^product-configuration$', views.ProductDetailConfiguration, name='product-configuration'),
    

    在view.py中:

    class ProductDetailConfiguration(viewsets.ModelViewSet):
        lookup_field = 'product_id'
        serializer_class = ProductConfigurationSerializer
    
        def retrieve(request, product_id=None, *args, **kwargs):
            queryset = self.get_queryset()
            # Filter with produc_id
            # print(product_id)
            # Return Response
    

    【讨论】:

      【解决方案4】:

      您可以通过以下方式从请求 url 中获取数据:- data_dict = self.request.data 这将返回请求 url 的所有参数的字典。 可以使用参数名作为key

      【讨论】:

      • 网址参数不存在。
      猜你喜欢
      • 2016-08-03
      • 2013-09-20
      • 2021-03-31
      • 2021-11-21
      • 2019-12-24
      • 2015-09-06
      • 2020-05-08
      • 1970-01-01
      • 2020-01-27
      相关资源
      最近更新 更多