Django基于现有属性值的默认模型属性?

时间:2012-04-20 17:13:12

标签: python django

我在Django中有一个简单的数据模型,类DepartmentRole。 (例如清酒。)

DepartmentRole具有一对多关系,Role类包含用于标识特定实例的ID。例如:

> Department: Sales
>> Role (1): Accounts
>> Role (3): Closing

> Department: Maintenance
>> Role (2): IT
>> Role (4): Equipment

这样做的缺点是每个角色都使用自己的全局 ID。因此,如果要创建大量销售角色,然后创建其他维护角色,则新维护角色将具有非常大的ID,并且看起来“不同步”。

因此,我想为每个角色创建一个部门特定的ID,如下所示:

class Role(models.Model):
    department_id = models.IntegerField()

缺点是我无法找到方法:

1)现有角色是否已将现有ID转移到新department_id字段,留下差距,但可防止出现未来差距:

> Department: Sales
>> Role (1): Accounts
>> Role (3): Closing
>> Role (4): *New Sales Role*

> Department: Maintenance
>> Role (2): IT
>> Role (4): Equipment
>> Role (5): *New Maintenance Role*

2)或者,动态地将default值分配给扫描表中每个部门的所有角色的方法,并为其分配新ID:

> Department: Sales
>> Role (1): Accounts
>> Role (2): Closing
>> Role (3): *New Sales Role*

> Department: Maintenance
>> Role (1): IT
>> Role (2): Equipment
>> Role (3): *New Maintenance Role*

我正在使用South来处理架构迁移。

1 个答案:

答案 0 :(得分:1)

您将需要三次迁移(采取方法二):

  1. 向Roles添加一个新字段(我将其称为user_id,因为它是我假设的用户可见ID ...) - 这是通过架构迁移完成的
  2. 创建一个循环遍历所有部门的数据迁移,获取每个部门的角色,并将它们重新编号为新的user_id字段(内部循环中的一个简单计数器应该足够,可能按当前主键排序角色)
  3. 添加另一个架构迁移,它将unique_together约束添加到department_id,user_id - 您不希望在一个部门中重复使用user_id。
  4. 向user_id字段添加一个新的默认方法,该字段根据需要获取数据(注意不要遇到丑陋的边缘情况 - 我会使用带有角色名称而不是整数ID的SlugField)

    你显然不会摆脱现有的pk,因为Django不支持复合主键(例如over department_id,user_id),但你不必在任何地方显示它。

    那说;如果它只是为了获得“好”的ID,我会选择slu而不是数字。