Django Rest Framework,在url中传递属性

Sar*_*maz 6 python django django-rest-framework

所以我有这两个模型:

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")
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nie*_*ano 8

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

1. 从 URL 路径

示例 URL:http://127.0.0.1:8000/myurl /passthisstringfrompath

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

urlpatterns = [
    path('myurl/<str:myattribute1>/', MyRestApiView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

参数 *args 和 **kwargs 是传递未定义数量的列表 (*args) 和 dict (**kwargs) 对象的 Python 方式,类似于 C++ 中的 Args...,更多信息请参见此处。使用它是因为在基于类的视图中,URL 参数是从此 kwargs 中获取的,更多信息请参见此处

2.从URL查询参数

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

在 urls.py 中:

urlpatterns = [
    path('myurl/', MyRestApiView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

或者更好的是,按照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"

请注意 urlpatterns 的顺序,不要将其中一种与另一种混合,始终将更具体的放在列表前面:

urlpatterns = [
    path('myurl/<str:myattribute1>/', MyRestApiView.as_view()),
    path('myurl/', MyRestApiView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)

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

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

请注意末尾的斜杠 /,以便以下 URL 会指向相同的资源:


lev*_*evi 0

您可以在 URL 中传递GET参数并在视图中检索它们

your.url.com?param1=value1&param2=value2
Run Code Online (Sandbox Code Playgroud)

那么在你看来

from rest_framework.views import APIView

class YourView(APIView):


    def get(self,request):
        parameters = request.query_params
        #use your URL parameters
Run Code Online (Sandbox Code Playgroud)