如何设置Django模型的每日更新限制



我是Django的新手。我创建了一个Django应用程序,用户可以在其中更新他们的轮班时间(早上/晚上/常规(,基于这个轮班时间,我从Django模型中获取实时数据,并运行Linux脚本,该脚本将评估用户使用该应用程序的轮班时间。

我使用了Django导入和导出,它允许用户通过从前端使用.xls文件上传多个用户的数据。现在,我想在这里应用一些限制,例如,假设我的模型有5000条记录,所以我希望只有50%的记录才能修改它是通过.xls文件还是通过单击更新单个记录添加的(我这样做是因为我不想允许在一天内更新超过50%的对象(。有什么最简单的方法来实现这一要求吗?

我已经检查过了https://pypi.org/project/django-limits/(django极限0.0.6(,但从步骤3中无法理解。

我正在添加我的型号。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')

有什么方法可以在模型.py级别中设置最大记录更新限制吗?

如有任何帮助或建议,我们将不胜感激。注意:此处我希望字段根据主键进行更新(此处我正在考虑id(示例:假设我有一个A模型,它包含500条记录,并且在.xls文件的帮助下,我想更改200条记录(这里这200条记录将根据500中的id/现有记录进行更改(。

为文件上传添加视图代码:

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

django限制不能满足您的需要。可能django limits所做的是,它对模型条目应用额外的验证。例如,如果您的限制是只能有20个活动用户,那么这正是过滤器集Q(is_active=True)所检查的。

关于更新模型和创建新对象的问题。有使用queryset.update(field=value)更新多行的项目和可能性,但这会将查询集中所有对象的同一列更新为相同的值。你可能不想要这个。如果您想从数据库中更新200个对象,并且您已经有了从数据库中获取它们的方法,那么当我使用单个sql查询并跳过使用django ORM时:https://docs.djangoproject.com/en/3.1/topics/db/sql/#executing-直接自定义sql

关于大体积插入件-有一些工具可用于:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#bulk-创建

现在,在哪些用户可以更新数据和哪些用户不更新数据之间进行选择——不要这样做。没有人想要一个只在50%的时间内工作的应用程序。如果您成功地构建了我上面提到的两个查询,那么每次.xls上传只会命中数据库三次:

  1. 从数据库中获取存在的对象
  2. 纯sql更新查询
  3. 大容量插入新对象

这不应该触发服务器无法处理的负载。

还有你使用反向url的方式(https://docs.djangoproject.com/en/3.1/ref/urlresolvers/#django.urls.reverse)似乎有故障:

  1. 反向调用不包括对象ID和
  2. 不使用视图名称

最新更新