【问题标题】:Django default model properties based on existing property values?基于现有属性值的Django默认模型属性?
【发布时间】:2012-04-20 17:13:11
【问题描述】:

我在 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 来处理架构迁移。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您将需要三个迁移(采用方法二):

    1. 向 Roles 添加一个新字段(我将其称为 user_id,因为它是我假设的用户可见 id……)- 这是通过架构迁移完成的
    2. 创建一个循环遍历所有部门的数据迁移,获取每个部门的角色并将它们重新编号到新的 user_id 字段中(内部循环中的一个简单计数器就足够了,可能按当前主键对角色进行排序)李>
    3. 添加另一个架构迁移,它将向部门 ID、用户 ID 添加 unique_together 约束——您不希望在一个部门中有重复的用户 ID。

    向 user_id 字段添加一个新的默认方法,根据需要获取数据(注意不要遇到丑陋的边缘情况——我会使用带有角色名称而不是整数 id 的 SlugField)

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

    这就是说;如果只是为了获得“漂亮”的 ID,我会选择 slug 而不是数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多