所以我有这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的新手。
答案 0 :(得分:2)
我通过两种方式从Django REST框架的URL传递属性:
示例网址: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。
示例网址: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
位置:
请注意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¶m2=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网址中的参数
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