基于现有属性值的Django默认模型属性?
问题描述:
我在Django中有一个简单的数据模型,类别为Department
和Role
。 (例如,清酒)基于现有属性值的Django默认模型属性?
A Department
与Role
具有一对多的关系,并且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*
我使用的是南来处理架构迁移。
答
您将需要三个迁移(录取办法二):
- 添加一个新的领域的角色(我称之为user_ID的,因为它是用户可见的标识我想...) - 这是通过做模式迁移
- 创建一个循环遍历所有部门的数据迁移,获取每个部门的角色并将其重新编入新的user_id字段(内部循环中的简单计数器应该足够了,可能会按当前主键排序角色)
- 添加另一个架构迁移,它为department_id,user_id添加unique_together约束 - 您可以不想在一个部门中重复使用user_ids。
添加一个新的默认方法,其获取的数据作为USER_ID领域的需要(小心不要碰到丑陋边缘的情况下 - 我会用一个SlugField与角色名称,而不是整数ID)
你显然不会摆脱现有的PK,因为Django不支持复合主键(例如over department_id,user_id),但不必在任何地方显示它。
这就是说;如果只是为了得到“好”的ID,我会选择slu instead而不是数字。