2012-04-20 177 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而不是數字。