Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django基于现有属性值的默认模型属性?_Python_Django - Fatal编程技术网

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

Python Django基于现有属性值的默认模型属性?,python,django,Python,Django,我在Django有一个简单的数据模型,其中包含类Department和Role。(例如,为了安全起见。) 部门与角色具有一对多关系,并且角色类包含一个用于标识特定实例的ID。例如: > Department: Sales >> Role (1): Accounts >> Role (3): Closing > Department: Maintenance >> Role (2): IT >> Role (4): Equipment

我在Django有一个简单的数据模型,其中包含类
Department
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转移到新的
部门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) 或者,动态地将
默认值
分配给一个方法,该方法扫描表中每个部门的所有角色,并为其分配新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来处理模式迁移。

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

  • 为角色添加一个新字段(我将其称为user_id,因为我假设它是用户可见的id…),这是通过模式迁移完成的
  • 创建一个数据迁移,它在所有部门上循环,获取每个部门的角色,并将它们重新编号到新的用户id字段中(内部循环中的一个简单计数器应该足够了,可能会按当前主键对角色进行排序)
  • 添加另一个模式迁移,它向部门id、用户id添加一个唯一的联合约束——您不希望在一个部门中有重复的用户id
  • 在user_id字段中添加一个新的默认方法,该字段根据需要获取数据(注意不要遇到难看的边缘情况——我将使用角色名而不是整数id的SlugField)

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

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