使用Django进行多个API调用并循环更新

时间:2018-10-04 21:36:11

标签: django django-models django-forms django-rest-framework django-request

我正在尝试进行API调用,并且能够通过表单从给定的输入(因此返回一条记录,并对该一条记录进行API调用)进行请求时使其正常工作。现在,如果没有提供输入,我想遍历实际表中的所有行,并对所有缺少的数据列进行API调用...

但是,当我尝试在同一页面上提交多个请求时,在表单提交时,我无法使api调用正常工作,但出现此错误:

/ p中的

JSONDecodeError 期望值:第1行第1列(字符0) 请求方法:POST 要求网址:http://localhost:8000/url Django版本:2.1.1 异常类型:JSONDecodeError 异常值:
期望值:第1行第1列(字符0) 异常位置:raw_decode中的C:\ Users \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib \ json \ decoder.py,第355行 Python可执行文件:C:\ Users \ .virtualenvs \ projects \ Scripts \ python.exe

更新:这是API失败,不是Django。剩下的问题留在批量更新中不起作用

进行API调用的视图:

class API(View):
  def get(self, request, *args, **kwargs):

    url = 'https://ExternalAPI/{param1}'.format(param1=param1)
    response = requests.get(url, headers={'x-Key': settings.KEY})

    if response.status_code == 404:
        return JsonResponse({})

    return JsonResponse(response.json()[0])

# Works for 1 row, doesn't work when called within a loop from a form submission....
  def getAnotherAPICall(self, request, address):
    print('getting data...')
    response = requests.get('{}?param={}&id={}'.format(settings.URL, data, settings.ID))
    data = response.json()  
    result = data['Response'][0] # This is based on the API itself....

    if response.status_code == 404:
      return {}

    return result

自定义方法没有URL。

path('api //',views.API.as_view(),name ='a')

我需要在Django内部进行此API调用(因为调用基于返回的内容),所以我不能为此使用Javascript或前端方法。

class MyView(TemplateView):
    def post(self, request):
        form = MyForm(request.POST)
        formIDInput = form.cleaned_data['formIDInput']
        apiData = []
            if form.is_valid():
               if(formIDInput):
                    resultQuerySet = MyModel.objects.filter(PrimaryID= str(formIDInput)) # One row, API call works
                else 
                    resultQuerySet = MyModel.objects.all()              #Multiple rows, API call doesn't work when API call is made

                 for result in resultQuerySet:
                          # This step fails:
                          apiData  = API.getAnotherAPICall(self, request, result.column1) # result.column1 is parameter to make the API call...

                        apiData.append({
                            'ID': result.PrimaryID,
                            'Data': apiData
                        })
                            MyModel.objects.update(columToUpdate = apiData['field'])

        return render(request, 'template.html', {
            'form': form,
            'results': resultQuerySet
        })

更新:因此,我发现循环运行正常。当循环进行得很好时,API在第二条记录上失败了。但是,使用从API返回的数据进行多次/批量更新以设置特定的列不起作用。

MyModel.objects.update(columToUpdate = apiData['field'])

不能循环工作。我验证了循环确实调用了更新。

1 个答案:

答案 0 :(得分:0)

对于其他任何阅读此问题的人,请注意,我是Django新手,也许使用了一些有问题的做法。但是,只要您想到以下几点,问题代码中的所有内容都可以正常工作:

  • 考虑边缘情况,例如,如果API不返回任何内容。返回''或无或其他内容,然后在处理数据字段之前检查是否返回了某些内容。添加一个try异常部分,以便如果API实际出错,您可以返回一些内容。
  • Django .update无法在同一列的具有不同数据值的循环中工作,因此请执行以下操作:

从django.db导入事务

@staticmethod

def updateBulk(id, newValue):
    rows = MyModel.objects.filter(id=id)

    transaction.set_autocommit(False)
    for row in rows:
            row.column1 = newValue

        row.save()
    transaction.commit()
    transaction.set_autocommit(True)