Django Rest Framework,在url中传递属性

时间:2015-10-07 14:44:21

标签: python django django-rest-framework

所以我有这2个型号:

class ProductQualityMonitor(models.Model):

    product_name = models.CharField(..)
    area = models.CharField(...))
    timeslot = models.DateTimeField(...)

    def get_measured_parameters(self):
        (...)

class QualityParameter(models.Model):
    PARAMETER_CHOICES = (
        (MEAN, MEAN),
        (MEDIAN, MEDIAN),
        (MAXIMUM, MAXIMUM),
        (MINIMUM, MINIMUM),
    )

    name = models.CharField(max_length=50, choices=PARAMETER_CHOICES)
    value = models.FloatField()
    product = models.ForeignKey(ProductQualityMonitor,
                                related_name="parameters")

我需要获得一些关于质量参数的汇总统计数据。我有一个接收一些属性的方法,比如日期范围,并为每个参数聚合十个十分之一的统计数据,最后返回一个包含所有聚合统计数据的json对象。

我的疑问是:我可以调用此方法,在url中传递方法所需的参数,并查看结果吗?而且,如果可以的话,我该怎么做?

对不起,如果我的解释有点乱,我是Django的新手。

3 个答案:

答案 0 :(得分:2)

我通过两种方式从Django REST框架的URL传递属性:

1。来自网址路径

示例网址:http://127.0.0.1:8000/myurl/passthisstringfrompath

在urls.py中(假设属性是一个字符串):

urlpatterns = [
    path('myurl/<str:myattribute1>/', MyRestApiView.as_view()),
]

在views.py中:

class MyRestApiView(APIView):
    def get(self, request, *args, **kwargs):
        if kwargs.get("myattribute1", None) is not None:
            print("the passed attribute:", kwargs["myattribute1"]) # this should print "passthisstringfrompath"
        return Response()
    def post(self):
        pass

参数* args和** kwargs是传递未定义数量的list(* args)和dict(** kwargs)对象的Python方式,类似于C ++中的Args,更多信息here 。之所以使用它,是因为在基于类的视图中,URL参数是从该kwarg中获取的,更多信息为here

2。通过网址查询参数

示例网址:http://127.0.0.1:8000/myurl/?myattribute1=passthisstringfromparam

在urls.py中:

urlpatterns = [
    path('myurl/', MyRestApiView.as_view()),
]

在views.py中:

class MyRestApiView(APIView):
    def get(self, request):
        if request.GET.get("myattribute1", None) is not None:
            print("the passed attribute:", request.GET["myattribute1"]) # this should print "passthisstringfromparam"
        return Response()
    def post(self):
        pass

或者更好的方法是按照https://www.django-rest-framework.org/api-guide/requests/下Django文档中的建议使用“ query_params ”,方法是将“ request.GET ”的所有实例均替换为“ request.query_params ”,然后其他所有内容都相同。

其他信息

当然,您可以结合使用上述两种方式来支持URL的组合,例如:http://127.0.0.1:8000/myurl/passthisstring/?mynextattribute=thenthissecond&mylastattribute=andthenthislast

位置:

  • kwargs [“ myattribute1”] =“ passthisstring”
  • request.query_params [“ mynextattribute”] =“ thenthissecond”
  • request.query_params [“ mylastattribute”] =“ andthenthislast”

请注意urlpattern的顺序不要相互混合,请始终将更具体的放在列表的前面:

urlpatterns = [
    path('myurl/<str:myattribute1>/', MyRestApiView.as_view()),
    path('myurl/', MyRestApiView.as_view()),
]

或者更好的是,您还可以将此urlpatterns简化为单个模式,其中考虑了input属性为可选的情况:

urlpatterns = [
    re_path('myurl/(?:(?P<myattribute1>\w+)/?)?', MyRestApiView.as_view()),
]

请注意最后的斜杠/,以使以下URL指向相同的资源:

答案 1 :(得分:0)

您可以在网址中传递GET个参数,并在视图中检索这些参数

your.url.com?param1=value1&param2=value2

然后在你看来

from rest_framework.views import APIView

class YourView(APIView):


    def get(self,request):
        parameters = request.query_params
        #use your URL parameters

答案 2 :(得分:0)

传递GET网址中的参数

Viewsets.py

from rest_framework import status
from rest_framework import viewsets

class YourViewSet(viewsets.ViewSet):
    def get_queryset(self):
        queryset = super(YourViewset, self).get_queryset()
        id = self.request.query_params.get('id', None)
        # do some operations return queryset