【问题标题】:How to assign and manage a priority mechanism如何分配和管理优先级机制
【发布时间】:2020-07-10 06:11:15
【问题描述】:

我正在开发一个Django Web 应用程序,用户可以在其中创建任务列表。每个任务都是数据库中的一条记录(即:一个 Django 对象),用户可以为每个任务分配优先级。

如果用户创建 10 个任务,则每个任务的优先级从 1 到 10。我正在努力寻找一种有效的方法来允许用户更改任务的优先级以及插入和删除任务。例如:

  • 用户将任务优先级 3 降低到 7。其他任务优先级需要相应调整。
  • 用户删除优先级为 4 的任务。需要再次调整剩余任务的优先级。
  • 用户插入优先级为 5 的新任务。这意味着需要转移优先级为 5 的现有任务。

对于如何根据每个项目的优先级管理基本上相当于队列的内容,同时允许用户:

  • 在优先级列表中上下移动任务
  • 删除任务
  • 添加具有指定优先级的新任务。

【问题讨论】:

    标签: python django algorithm design-patterns


    【解决方案1】:

    您为什么如此努力地建立队列?你不能只使用.order_by

    假设这是您的模型:

    class Task(models.Model):
        user = models.ForeignKey(User)
        priority = models.IntegerField()
        created = models.DateTimeField(auto_now=True)
    

    然后,当您需要一个用户的所有任务列表时,您可以这样做

    qs = Task.objects.filter(user=your_user_instance).order_by('-priority', 'created')
    

    现在变量 qs 是一个迭代器,它首先列出最高优先级的任务(如果两个任务具有相同的优先级,它将首先列出较旧的任务)

    【讨论】:

    • 感谢您的建议,但我认为这不适合用户优先上下移动任务。例如,我们有 5 个优先级为 1、2、3、4、5 的任务。然后,用户将 UI 上的任务 4 拖到任务 3 上方。这将如何在数据库中发挥作用?
    • @darkpool 然后你只需更新数据库并将优先级更改为新的优先级
    • 不幸的是,在这种情况下我们会遇到一个问题:用户将优先级 4 降低到优先级 3。我们现在有两个优先级 3,这很好,因为我们还按创建/更新日期排序。然后用户尝试将优先级 5 移到两个优先级 3 之间,....这是行不通的。
    【解决方案2】:

    这是我为我解决上述案例的方法

    task_order_list = self.request.POST.get("task_order_list",'[]')
    task_order_list = json.loads(task_order_list)
    
    task_qs = Task.objects.all()
    for priority,id in enumerate(task_order_list):
        task_qs.filter(id=id).update(priority=priority)
    

    对于上面的 sn-p,假设:

    任务ID的实际列表:[1,2,3,4,5]

    输入:

    新列表:[5,3,2,4,1]

    输出:

    更新列表:[5,3,2,4,1]

    【讨论】:

      【解决方案3】:

      您不必为优先级分配数字。您可以只使用理论上具有无限分辨率的字符串。

      item      index
      -----------------
      gizmo     1
                    <<------ Oh no! no room between 1 and 2.
                             This requires incrementing _every_ item after it
      gadget    2
      gear      3
      toolkit   4
      box       5
      

      但是如果你按 100 来计算的话:

      item      index
      -----------------
      gizmo     100
                    <<------ Sweet :). I can re-order 99 (!) items here
                             without having to change anything else
      gadget    200
      gear      300
      toolkit   400
      box       500
      

      更好:以下是 Jira 解决此问题的方法。他们的“排名”(你称之为索引)是一个字符串值,它允许在排名项目之间有大量的喘息空间。

      这是我使用的 jira 数据库的真实示例

         id    | jira_rank
      ---------+------------
       AP-2405 | 0|hzztxk:
       ES-213  | 0|hzztxs:
       AP-2660 | 0|hzztzc:
       AP-2688 | 0|hzztzk:
       AP-2643 | 0|hzztzs:
       AP-2208 | 0|hzztzw:
       AP-2700 | 0|hzztzy:
       AP-2702 | 0|hzztzz:
       AP-2411 | 0|hzztzz:i
       AP-2440 | 0|hzztzz:r
      

      注意这个例子 hzztzz:i。字符串排名的优点是您在两个项目之间的空间不足,您仍然不必重新排名其他任何东西。您只需开始将更多字符附加到字符串以缩小焦点。 基于here的回答

      虽然说this这个包是相当用的,但实际上使用的是一个正整数并发出SQL来更新所有以下的订单号。

      【讨论】:

        猜你喜欢
        • 2016-02-07
        • 1970-01-01
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        相关资源
        最近更新 更多