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 的新手。
我通过两种方法从 Django REST 框架的 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 中获取的,更多信息请参见此处。
示例 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
在哪里:
请注意 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 会指向相同的资源:
您可以在 URL 中传递GET参数并在视图中检索它们
your.url.com?param1=value1¶m2=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)
| 归档时间: |
|
| 查看次数: |
3354 次 |
| 最近记录: |