0

Django には、クラスDepartmentRole. (例:日本酒)

は と 1対多Departmentの関係Roleにあり、Roleクラスには特定のインスタンスを識別するために使用される ID が含まれています。例えば:

> Department: Sales
>> Role (1): Accounts
>> Role (3): Closing

> Department: Maintenance
>> Role (2): IT
>> Role (4): Equipment

これの欠点は、各ロールが独自のグローバルID を使用していることです。そのため、多数の Sales ロールを作成してから追加の Maintenance ロールを作成すると、その新しい Maintenance ロールの 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*

default2) または、各部門のすべてのロールのテーブルをスキャンして新しい 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 を使用しています。

4

1 に答える 1

1

3 つの移行が必要になります (アプローチ 2 を採用):

  1. Roles に新しいフィールドを追加します (これは、私が想定しているユーザーに表示される ID であるため、user_id と呼びます…) -- これは、スキーマの移行によって行われます。
  2. すべての部門をループし、各部門のロールを取得して新しい user_id フィールドに再番号付けするデータ移行を作成します (内側のループの単純なカウンターで十分です。おそらく、現在の主キーによってロールを並べ替えます)。
  3. 部門 ID、ユーザー ID に unique_together 制約を追加する別のスキーマ移行を追加します。1 つの部門で重複するユーザー ID は望ましくありません。

必要に応じてデータをフェッチする新しいデフォルト メソッドを user_id フィールドに追加します (醜いエッジ ケースに遭遇しないように注意してください。整数 ID の代わりにロール名で SlugField を使用します)。

Django は複合主キー (department_id、user_id など) をサポートしていないため、明らかに既存の pk を削除することはできませんが、それをどこにも表示する必要はありません。

そうは言っても; 「いい」ID を取得するだけの場合は、数字ではなくスラッグを選択します。

于 2012-04-20T18:25:38.510 に答える