Django中的APIView链接

时间:2018-08-19 13:29:56

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

我想链接API的调用,我所拥有的是:

from django.views import View
from rest_framework.views import APIView
from rest_framework.response import Response

class ChildAPI(APIView)
  def get(self, request):
    store_id = request.GET.get('store_id')

    prodcuts = ProductsModel.objects\
               .filter(store_id=store_id)\
               .annotate(SUM('price'))... etc
    x = products['price__sum']
    y = products['tax__sum']

现在,而不是从ChildAPI返回响应,我想通过xypost参数传递给ParentAPI返回响应为:

class ParentAPI(APIView):
  def post(self, request):
    store_id = request.POST.get('store_id')
    x = request.POST.get('x')
    y = request.POST.get('y')
    AwesomeModel.objects.filter(...).update(x=x,y=y)
    return Response({"code": 1, "message": "Updated"})

我正在读Calling a REST API from Django view
由于无法通过post传递参数,并且url是通过requests命中的,因此如果没有domainname.com不能做到这一点,即就像我们通过namespace一样来自Django templates,格式为:

<form method="post" action="{% url 'product:update-product' %}">
  <input type="hidden" value="{{ x }}" name="x">
  <input type="hidden" value="{{ y }}" name="y">
  <input type="submit" value="Update">
</form>

注意:我在另一个Django应用ParentAPI url文件中使用了urls模式,

我们从另一个函数中调用一个函数的方式可以从另一个通过post包装的参数中调用一个API

已更新:

这里ParentAPI也被独立调用,因此我只想通过request传递包装到post中的参数。无法通过它们来充当ParentAPI.post(request, x=x)
如果ParentAPI被独立命中,那么我会创建一个带有可变自变量参数**kwarg的函数并调用该函数。
如果这样做,我将拥有:

class ParentAPI(APIView):
  def post(self, request, *args, **kwargs):
    x = request.POST.get('x')
    if not x:
      x = kwargs['x']

基本上,我想发送x,y包装的request。因此ParentAPI可以以request.POST.get('x')reques.POST['x']

的身份访问它

1 个答案:

答案 0 :(得分:2)

做这样的事情,

from rest_framework.views import APIView


class Parent(APIView):
    def post(self, request, *args, **kwargs):
        return Response(data={"store_id": kwargs['store_id']})


class ChildAPI(APIView):
    def get(self, request, *args, **kwargs):
        store_id = request.GET.get('store_id')
        parent = Parent()
        return parent.post(request, store_id=store_id)

访问子api /child/?store_id=12323,您将获得Parent API的响应