1

自動インクリメント主キー整数 (1 ~ 32767) の RangeA と RangeB (32768 ~ 2147483647) が与えられます。条件が true の場合は、RangeA に割り当てられた主キーでオブジェクトを保存し、それ以外の場合は RangeB に保存します。

管理者 (私) は、RangeA に保存する唯一のユーザーです。上記が不可能な場合: Django が常に RangeB に保存され、RangeA に保存するためにシェルに入る必要がある場合、理想的ではありませんが、それでも使用できます。

Django と Postgres を使用してこれを行うにはどうすればよいですか?

4

1 に答える 1

1

かなり可能。まず、モデルを変更して、標準の AutoField を主キーとして使用しないようにします。

class MyModel(models.Model):
    id  = models.IntegerField(primary_key=True)

次に、postgresql に接続して、2 つの異なるシーケンスを作成する必要があります。

CREATE SEQUENCE small START 1;
CREATE SEQUENCE big START 32768;

これを PSQL コンソールに入力する代わりに、django 移行を編集して (RunSQL ディレクティブを使用して) これらを作成することも検討してください。

次のステップは、保存メソッドをオーバーライドすることです

def save(self,*args, **kwargs)
    if not self.id :
        cursor = connection.cursor()
        if small condition:
            cursor.execute("select nextval('small')")
        else:
            cursor.execute("select nextval('big')")

        self.id = cursor.fetchone()[0]

    super(MyModel,self).save(*args,**kwargs)

save メソッドをオーバーライドする代わりに、postgresql BEFORE INSERT トリガーを作成することもできます。nextval を取得するための往復はそれほどコストがかかりませんが、これが懸念される場合は、トリガーを作成することを選択できます。その場合、save メソッドをオーバーライドする必要はありませんが、トリガー内に同じロジックを実装する必要があります。

于 2017-01-08T01:22:10.307 に答える