gpt4 book ai didi

python - Django Rest Framework 在后台从模型中导出 csv 数据

转载 作者:行者123 更新时间:2023-12-05 02:57:24 25 4
gpt4 key购买 nike

目前,我使用的是 DRF 版本“3.9.2”。我正在同步地从模型中导出一些 CSV 文件。代码块示例解释如下:

urls.py

from django.urls import path

urlpatterns = [
path('api/users-csv-export/', UsersExportAsCSV.as_view())
]

views.py

from rest_framework.views import APIView

def get_users_data():
queryset = User.objects.only('first_name', 'last_name', 'created_at', 'email', 'gender', 'date_of_birth')
fields = ['first_name', 'last_name', 'created_at', 'email', 'gender', 'date_of_birth']
titles = ['First Name', 'Last Name', 'Date Added', 'Email', 'Gender', 'Date of Birth']
file_name = 'users'
return queryset, fields, titles, file_name

class UsersExportAsCSV(APIView):
def get(self, request):
users = get_users_data()
data = export_to_csv(queryset=users[0], fields=users[1], titles=users[2], file_name=users[3])
return data

utils.py

def export_to_csv(queryset, fields, titles, file_name):
"""
will export the model data in the form of csv file
:param queryset: queryset that need to be exported as csv
:param fields: fields of a model that will be included in csv
:param titles: title for each cell of the csv record
:param file_name: the exported csv file name
:return:
"""
model = queryset.model
response = HttpResponse(content_type='text/csv')
# force download
response['Content-Disposition'] = 'attachment; filename={}.csv'.format(file_name)
# the csv writer
writer = csv.writer(response)
if fields:
headers = fields
if titles:
titles = titles
else:
titles = headers
else:
headers = []
for field in model._meta.fields:
headers.append(field.name)
titles = headers

# Writes the title for the file
writer.writerow(titles)

# write data rows
for item in queryset:
writer.writerow([nested_getattr(item, field) for field in headers])
return response

随着数据的增长,请求-响应周期变得越来越繁重。为了防止此请求阻塞其他请求 线程异步任务 哪个更可取?关于优化请求-响应周期有什么好主意吗?

这里用户必须等到整个导出工作和下载完成。这里期望的结果是,每当用户访问 URL 时,立即响应“正在生成文件”并在后台生成和下载文件。

非常感谢有关此主题的任何帮助。

最佳答案

我认为你可以用这个实现 http://www.celeryproject.org/

您可以使用“shared_task”来完成在后台生成 csv 文件的任务,如果它已经完成,则将其保存到表中(例如:DownloadFileModel)。然后你可以稍后下载它。
响应你当前的 View 重定向到你准备下载文件的DetailView(DownloadFileModel record with null value in file field),如果文件没有准备好就给出描述等待直到文件已准备就绪(您可以将文件分配给记录)。

关于python - Django Rest Framework 在后台从模型中导出 csv 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59729837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com