Django从视图中调用api保存数据

Posted

技术标签:

【中文标题】Django从视图中调用api保存数据【英文标题】:Django save data from calling api in views 【发布时间】:2018-07-03 00:13:58 【问题描述】:

所以我有一个视图,它有一个调用另一个 django 项目 API 的 Get 和 Post 请求。但我还想保存从 api 调用中获得的信息。

项目 1 有一个约会表,其中包含这些字段 clinic IdtimequeueNo。当我向项目 2 发出发布请求以进行/创建约会时,成功创建后,它将显示我要保存到项目 1 约会表数据库中的那 3 个字段。我该怎么做 ?我的约会也有一个 API,我该如何保存呢?

这是我的视图调用 api 到另一个 django 项目的代码

views.py

@csrf_exempt
def my_django_view(request):
    if request.method == 'POST':
        r = requests.post('http://127.0.0.1:8000/api/test/', data=request.POST)
    else:
        r = requests.get('http://127.0.0.1:8000/api/test/', data=request.GET)
    if r.status_code == 200:
        # r.text, r.content, r.url, r.json
        return HttpResponse(r.text)
    return HttpResponse('Could not save data')

【问题讨论】:

你的数据存储接口在哪里?你在使用 django ORM 吗? Django ORM ?据我所知,我使用的只是 django 和 django rest 框架 你是如何定义你的Appointment 表的?你是用 Python 做的,还是直接用 SQL 做的? 【参考方案1】:

假设您在项目 2 中的端点返回一个 JSON 响应,其中包含您需要的字段:


    "clinicId": 1,
    "time": some-time-string,
    "queueNo": 2

您可以在发出请求后通过调用r.json()检索响应。

基于此,您可以将r.json() 视为字典并使用Appointment.objects.create(**r.json()) 创建实例。以下是它的外观。

@csrf_exempt
def my_django_view(request):
    if request.method == 'POST':
        r = requests.post('http://127.0.0.1:8000/api/test/', data=request.POST)
    else:
        r = requests.get('http://127.0.0.1:8000/api/test/', data=request.GET)

    if r.status_code == 200 and request.method == 'POST':
        # Convert response into dictionary and create Appointment
        data = r.json()
        # Construct required dictionary
        appointment_attrs = 
            "clinicId": data["some-key-that-points-to-clinicid"],
            "time": data["some-key-that-points-to-time"],
            "queueNo": data["some-key-that-points-to-queue-num"]
        
        appointment = Appointment.objects.create(**appointment_attrs)
        # r.text, r.content, r.url, r.json
        return HttpResponse(r.text)
    elif r.status_code == 200:  # GET response
        return HttpResponse(r.text)

    return HttpResponse('Could not save data')

【讨论】:

谢谢!但是很抱歉给您带来更多麻烦,如果我返回的 json 有 5 个字段(a、b、c、d、e)但我只想保存这 3 个字段(a、c、e)怎么办。那我该怎么办?而且,如果我返回的 json 中的字段名称与我保存的字段名称不同,我该如何保存? 我更新了我的答案——更多的是转换 Python 字典的问题。所以你可以使用任何方法,我上面演示的只是你可以做到的方法之一——通过创建一个包含你需要的键的字典并将数据从data 字典映射到新字典。 ** 是一种解压 Python 字典的方法,可以节省您输入各个字段的时间。如果这对您来说是新的,您可以通过 Google 找到更多信息。 只是补充一下,在这种情况下,Appointment.objects.create(**appointment_attrs) 转换为 Appointment.objects.create(clinicId=<somevalue>, time=<sometime>, queueNo=<somenum>) 这样"clinicId": data["clinicId"],?好的去试试看。谢谢 如果他们有相同的键,那么我认为你不需要这样做。您需要做的就是使用del data["key-that-you-dont-want"] 之类的方法从data 字典中删除不需要的键,然后执行.create(**data)【参考方案2】:

您首先必须从响应中提取数据。 如果您正在使用 requests 库并且您调用的 API 在 JSON 中响应,您可以执行 data = r.json() 之类的操作。

不过,我不知道您的第二个 API 响应的结构,但我假设您可以从 data 对象中获取您的字段。

然后,使用您正在使用的任何数据库接口保存您想要的内容。如果它是 django ORM,并且您在某处有一个 Appointement 模型,您可以执行类似的操作

Appointment(
    clinic_id=data["clinic_id"], 
    time=data["time"], 
    queueNo=data["queueNo"]
).save()

你已经完成了......

【讨论】:

我在 models.py 中创建了表。如前所述,Django 项目 1 就是这 3 个字段。 clinic IdtimequeueNo。 Django 项目 2 也具有与这 3 个字段以及更多附加字段相同的表。我从未听说过 django ORM,但谢谢。我为表所做的只是models.py serializer.pyviews.py “ORM”表示“对象关系映射”。这是您以面向对象的方式定义关系数据库(即 SQL)表并与之交互的方式。当您使用 django 框架定义模型并进行查询或将数据保存到数据库时,您使用的是 django ORM。还有其他的。

以上是关于Django从视图中调用api保存数据的主要内容,如果未能解决你的问题,请参考以下文章

在Django中将计算值从视图保存到模型

将数据从列表视图(从 Rest Api 生成)传递到另一个活动并将其保存到 SQLite 数据库中

NodeJ使用请求承诺来调用外部API,从响应主体中保存数据

Django:表单未保存到数据库

如何从 django 的表单中获取数据?

django 在第一次脚本运行后每天保存一次数据到文件