使用JSON在python中创建Rest Api?

时间:2016-10-08 10:58:26

标签: python json django rest api

我是python REST API的新手,因此面临一些特殊问题。我希望当我以pathlabid(主键)输入输入时,我希望将该键指定的相应数据作为输出。当我运行以下代码时,我只获得与数据库中第一行表对应的数据,即使我输入的id属于某个其他行。 这是VIEWS.PY

class pathlabAPI(View):
@csrf_exempt
def dispatch(self, *args, **kwargs):
    # dont worry about the CSRF here
    return super(pathlabAPI, self).dispatch(*args, **kwargs)

def post(self, request):
    post_data = json.loads(request.body)
    Pathlabid = post_data.get('Pathlabid') or ''
    lablist = []
    labdict = {}

    lab = pathlab()
    labs = lab.apply_filter(Pathlabid = Pathlabid)


    if Pathlabid :


        for p in labs:
                labdict["Pathlabid"] = p.Pathlabid
                labdict["name"] = p.Name
                labdict["email_id"] = p.Emailid
                labdict["contact_no"] = p.BasicContact
                labdict["alternate_contact_no"] = p.AlternateContact
                labdict["bank_account_number"] = p.Accountnumber
                labdict["ifsccode"] = p.IFSCcode
                labdict["country"] = p.Country
                labdict["homepickup"] = p.Homepickup
                lablist.append(labdict)
                return HttpResponse(json.dumps(lablist))
    else:

        for p in labs:
                labdict["bank_account_number"] = p.Accountnumber
                lablist.append(labdict)
                return HttpResponse(json.dumps(lablist))

2 个答案:

答案 0 :(得分:0)

您将在for循环中返回响应,以便第1个条目中的循环中断

import json
some_list = []
for i in data:
    some_list.append({"key": "value"})
return HttpResponse(json.dumps({"some_list": some_list}), content_type="application/json")

尝试以上示例来解决您的问题

答案 1 :(得分:0)

整体方法和代码存在许多问题,但要解决您所描述的问题,但作为第一个修复,我同意另一个答案:您需要将return语句从循环。现在,只要您循环一次循环,就会return列出您的列表,这就是为什么您总是会得到一个包含一个元素的列表。以下是对此的修复(您需要在代码顶部添加from django.http import JsonResponse):

if Pathlabid:
    for p in labs:
        labdict["Pathlabid"] = p.Pathlabid
        labdict["name"] = p.Name
        labdict["email_id"] = p.Emailid
        labdict["contact_no"] = p.BasicContact
        labdict["alternate_contact_no"] = p.AlternateContact
        labdict["bank_account_number"] = p.Accountnumber
        labdict["ifsccode"] = p.IFSCcode
        labdict["country"] = p.Country
        labdict["homepickup"] = p.Homepickup
        lablist.append(labdict)
else:
    for p in labs:
        labdict["bank_account_number"] = p.Accountnumber
        lablist.append(labdict)

return JsonResponse(json.dumps(lablist))

正如评论中所建议的那样,使用Django Rest Framework或类似的软件包将是一种改进。作为一般规则,在Django或其他ORM中,您希望避免循环遍历此类查询集并调整每个元素。为什么不序列化查询集本身并在模板或其他消费者中执行此循环中的逻辑?