【问题标题】:How to set daily Update limit on Django model如何设置 Django 模型的每日更新限制
【发布时间】: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


【解决方案1】:

django-limits 不能满足您的需要。大概。 django 限制的作用是对模型输入应用额外的验证。例如,如果您的限制是您只能拥有 20 个活跃用户,这正是 filterset Q(is_active=True) 检查的内容。

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

关于批量插入 - 有一些工具:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#bulk-create

现在关于选择哪些用户可以更新他们的数据,哪些不能更新 - 不要这样做。没有人想要一个只能在 50% 的时间内运行的应用程序。如果您成功构建了我上面提到的这两个查询,那么每次 .xls 上传只需访问数据库 3 次:

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

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

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

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

【讨论】:

  • 感谢您的回复!我已经更新了我的问题。我想根据我通过 .xls 文件上传的主键更新记录,因此对于匹配主键,只会发生更改,但需要一些不计对象更改的东西,一旦达到限制,它应该显示错误第二天,该计数应自行恢复为 0。
猜你喜欢
  • 1970-01-01
  • 2015-08-27
  • 2022-08-14
  • 2020-11-19
  • 2019-08-17
  • 2019-05-13
  • 1970-01-01
  • 2010-10-06
  • 2015-11-26
相关资源
最近更新 更多