【问题标题】:Field for Order in Django ModelDjango 模型中的订单字段
【发布时间】:2020-11-11 11:21:53
【问题描述】:

我有一个模型叫Employee

Employee:

  • Name: 字符域
  • Email: 邮箱字段
  • Age: 整数字段
  • Ranking:整数字段

我的问题来自Ranking 字段。 Ranking 字段应该确定员工的订单,我根据他们的工作量来确定。我在 Django admin 中设置了这个值。

问题是,如果我添加一个员工并将其放在Ranking = 2我必须在 2 之后调整每个其他员工的 Ranking。这有意义吗。 如何避免这种情况?

谢谢!

【问题讨论】:

  • 你可以试试链表的方法。将您的 Ranking 字段替换为 EmployeeAbove 字段,这将是一个外键,指向在排名顺序中排在前面的员工。这样,无论您的表中有多少员工,您都需要更新最多 3 名员工。
  • 为什么不使用FloatField?如果需要在两个值之间插入,则使用两者之间的平均值。所以在23之间,你可以使用2.5。在22.5之间可以使用2.25
  • @WillemVanOnsem 我对使用浮点数犹豫不决,因为它看起来有点笨重,但会考虑。
  • @ShahinMursalov 这听起来很有趣。我怎么能设置它让两个人不能指向一个人呢?
  • @ShahinMursalov 您应该将此作为答案发布,尽管这使得确定第 100 名员工是谁变得更加困难。

标签: django django-models


【解决方案1】:

好的,这还没有经过测试,但总体思路是重写.save() 方法,这样当一个实例的排名发生变化时,您可以重新计算其他实例的排名:

class Employee(models.Model):
    ...
    def save(self, *args, **kwargs):
        other_employees = Employee.object.exclude(pk=self.pk).order_by("ranking")
        i = 1
        for employee in other_employees:
            if i == self.ranking:
                i += 1
            employee.ranking = i
            employee.save()
        super(Employee, self).save(*args, **kwargs)

请注意,这不是生产质量代码。您可能应该对竞争条件(例如两个人同时保存两个 Employee 对象)和其他怪癖做一些事情。

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 2012-03-02
    • 2010-10-30
    • 2020-03-30
    • 1970-01-01
    • 2013-08-27
    • 2019-12-24
    • 2023-04-08
    • 2010-11-11
    相关资源
    最近更新 更多