【发布时间】:2021-01-04 16:14:10
【问题描述】:
我是 Django 新手。我创建了一个 Django 应用程序,用户可以在其中更新他们的轮班时间(早上/晚上/一般),并基于这个轮班时间我从 Django 模型中获取实时数据并运行 Linux 脚本,该脚本将评估用户轮班时间与允许的时间使用该应用程序。
我使用过 Django 导入和导出,它允许用户使用前端的 .xls 文件上传多个用户的数据。现在在这里我想应用一些限制,例如假设我的模型有 5000 记录,所以我希望只有 50% 的记录应该是允许修改是通过 .xls 文件添加还是通过单击更新单个记录添加(我这样做是因为我不想在一天内允许更新超过 50% 的对象)。有没有最简单的方法来实现这个要求?
我检查了https://pypi.org/project/django-limits/ (django-limits 0.0.6),但从第 3 步开始没有理解。
我正在添加我的 models.py
class CTA(models.Model):
AConnectID = models.CharField(max_length=100,)
Shift_timing = models.CharField(max_length=64, choices=SHIFT_CHOICES, default='9.00-6.00')
EmailID = models.EmailField(max_length=64, unique=True, )
Vendor_Company = models.CharField(max_length=64, )
Project_name = models.CharField(max_length=25, default="")
SerialNumber = models.CharField(max_length=19, default="")
Reason = models.TextField(max_length=180)
last_updated_time = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-id']
def get_absolute_url(self):
return reverse('/ctall')
有什么方法可以在 models.py 级别设置最大记录更新限制?
对此的任何帮助或建议将不胜感激。 注意:这里我想根据主键更新字段(这里我正在考虑id) 示例:假设我有模型 A 并且它包含 500 条记录并且在 .xls 文件的帮助下我想更改 200 条记录(这里这 200 条记录将根据 id/existing in 500 更改) .
为文件上传添加查看代码:
def upload_view(request):
if request.user.is_authenticated:
print(request.user.username)
# logger.info(messages, extra={'username': request.user.username})
response = HttpResponse(content_type='application/ms-excel')
response['Content-Disposition'] = 'attachment; filename="CTA_ShiftTiming.xls"'
wb = xlwt.Workbook(encoding='utf-8')
ws = wb.add_sheet('CTA_ShiftChange Data') # this will make a sheet named Users Data
# Sheet header, first row
row_num = 0
font_style = xlwt.XFStyle()
font_style.font.bold = True
columns = ['id', 'AID', 'Shift_timing', 'EmailID', 'Vendor_Company', 'Project_name',
'SerialNumber',
'Reason', 'last_updated_time']
for col_num in range(len(columns)):
ws.write(row_num, col_num, columns[col_num], font_style) # at 0 row 0 column
# Sheet body, remaining rows
font_style = xlwt.XFStyle()
cta_list = CTA.objects.all()
cta_filter = CTAFilter(request.GET, queryset=cta_list)
allcta = cta_filter.qs
rows = allcta.values_list('id', 'AID', 'Shift_timing', 'EmailID', 'Vendor_Company',
'Project_name', 'SerialNumber', 'Reason', 'last_updated_time')
for row in rows:
row_num += 1
for col_num in range(len(row)):
ws.write(row_num, col_num, row[col_num], font_style)
wb.save(response)
return response
【问题讨论】:
-
嘿@Shailesh - 你的更新还不够。您没有解释更新或不更新的决定是基于什么。您有来自 .xls 文件的 500 条记录,并且希望只允许更改其中的 200 条?查看记录,您怎么知道它来自 .xls?感觉你脑子里有一些知识,但你假设的东西太多,解释得不够。
-
简单回答您的问题“有什么方法可以在 models.py 级别设置最大记录更新限制吗?”没有。您仍然没有解释完整的业务逻辑。所以你已经有 500 个项目在数据库中,有人上传了另外 200 个,它们可以更新吗?是吗?你能解释一下为什么有些项目可以更新而有些不能更新的逻辑吗?这个决定是如何做出的?
-
@OdifYltsaeb 我有一个 Django 模型 CTA,它已经有 500 个用户对象。我想更新 200 个用户从早上到晚上的轮班时间,为此,我使用 .xls 文件,该文件将在现有数据库记录中进行查找并更改匹配 ID。 (假设模型 ID 字段为 20912,如果 .xls 文件中存在相同的 ID,那么它将根据 .xls 更新更改班次记录,否则如果 .xls 文件中的 ID 在模型中不存在,那么它将创建一个新对象。)
-
Ans: 由于某些服务器负载阈值限制,我们不想让超过 50% 的用户在一天内更改轮班时间。我正在使用 Django 导入导出库,并且每当我更新时通过以正确格式插入 .xls 的记录,它将检查现有的 id(主键),它将更新数据中的差异,如果 db 中不存在 id,那么它将创建新记录。并假设如果 tomm 用户想要更改数据,他将下载数据(基于过滤)并在更改轮班时间后在该表中上传。
-
谢谢。现在这是明确的解释,与您最初所说的无关。如果我理解正确的话。要进行选择性更新/插入,我会这样做:1)从数据库中选择所有已经存在的对象,然后更新它们。 2) 然后批量插入新的对象:docs.djangoproject.com/en/3.0/ref/models/querysets/#bulk-create 但是大约 50% 的用户 - 这只是没有意义。想象一下使用只能在 50% 的时间内工作的产品 - 你会自己使用它吗?
标签: python django django-models django-views django-forms