簡體   English   中英

如何設置 Django model 的每日更新限制

[英]How to set daily Update limit on Django model

我是 Django 的新手。 I have created one Django App where users can update their Shift Timing(Morning/Evening/General) and based on this Shift Timing I am taking real-time data from Django Model and running Linux script which will be evaluating user shift timing with allowed timing使用該應用程序。

我使用了 Django 導入和導出,它允許用戶使用前端的.xls文件上傳多個用戶的數據。 現在在這里我想應用一些限制,例如假設我的 model 有5000條記錄,所以我希望只有50%的記錄應該被允許修改它是通過.xls 文件添加還是通過單擊更新單個記錄(我是這樣做是因為我不想在一天內允許更新超過 50% object)。 有沒有最簡單的方法來實現這個要求?

我已經檢查了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 )示例:假設我有 model A並且它包含 500 條記錄,並且在 .xls 文件的幫助下我想更改 200 條記錄(這里是這些200 條記錄將根據 500 中的 id/existing 更改)。

添加文件上傳的視圖代碼:

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-limits 不能滿足您的需要。 大概。 django 限制做什么,它對 model 條目應用額外的驗證。 例如,如果您的限制是您只能擁有 20 個活躍用戶,這正是 filterset Q(is_active=True)檢查的內容。

關於您更新模型和創建新對象的問題。 有使用queryset.update(field=value)更新多行的項目和可能性,但這會將查詢集中所有對象的同一列更新為相同的值。 你可能不想要這個。 If you want to update 200 objects from database, and you already have some way of getting them from database, when I would do it with single sql query and skip using 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. 從數據庫中獲取,其中 object 存在
  2. 純sql更新查詢
  3. 批量插入新對象。

這不應觸發服務器無法處理的負載。

此外,您使用反向 url ( https://docs.djangoproject.com/en/3.1/ref/urlresolvers/#django.urls.reverse )的方式似乎是錯誤的:

  1. 反向調用不包括 object ID 和
  2. 不使用視圖名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM