2012-04-20 87 views
0

我在Django中有一个简单的数据模型,类别为DepartmentRole。 (例如,清酒)基于现有属性值的Django默认模型属性?

A 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* 

我使用的是南来处理架构迁移。

回答

1

您将需要三个迁移(录取办法二):

  1. 添加一个新的领域的角色(我称之为user_ID的,因为它是用户可见的标识我想...) - 这是通过做模式迁移
  2. 创建一个循环遍历所有部门的数据迁移,获取每个部门的角色并将其重新编入新的user_id字段(内部循环中的简单计数器应该足够了,可能会按当前主键排序角色)
  3. 添加另一个架构迁移,它为department_id,user_id添加unique_together约束 - 您可以不想在一个部门中重复使用user_ids。

添加一个新的默认方法,其获取的数据作为USER_ID领域的需要(小心不要碰到丑陋边缘的情况下 - 我会用一个SlugField与角色名称,而不是整数ID)

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

这就是说;如果只是为了得到“好”的ID,我会选择slu instead而不是数字。