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 Id
、time
和 queueNo
。当我向项目 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 Id
、time
和 queueNo
。 Django 项目 2 也具有与这 3 个字段以及更多附加字段相同的表。我从未听说过 django ORM,但谢谢。我为表所做的只是models.py
serializer.py
和views.py
“ORM”表示“对象关系映射”。这是您以面向对象的方式定义关系数据库(即 SQL)表并与之交互的方式。当您使用 django 框架定义模型并进行查询或将数据保存到数据库时,您使用的是 django ORM。还有其他的。以上是关于Django从视图中调用api保存数据的主要内容,如果未能解决你的问题,请参考以下文章
将数据从列表视图(从 Rest Api 生成)传递到另一个活动并将其保存到 SQLite 数据库中