2017-01-08 12 views
1

自動インクリメントプライマリキー整数(1〜32767)とレンジB(32768〜2147483647)の範囲Aを指定します。条件が真であれば、RangeAにプライマリキーが割り当てられたオブジェクトを保存し、それ以外の場合はRangeBに保存します。プライマリキー整数の範囲を割り当てます

admin(me)は、RangeAに保存する唯一のユーザーです。上記が不可能な場合:理想的ではありませんが、Djangoが常にRangeBに保存していて、RangeAに保存するためにシェルに入る必要がある場合にはまだ使用可能です。

これはDjangoとPostgresを使ってどうやって行えますか?

答えて

1

かなり可能です。まず最初は、それが主キー

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

として標準のAutoFieldを使用しないようにモデルを変更することです次に、あなたは、PostgreSQLに接続して、二つの異なるシーケンスを作成する必要があります。

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) 

代替がINSERTトリガ以前のPostgreSQLを作成することでオーバーライドすることです。 nextvalを取得するための往復は非常に高価ではありませんが、トリガーを作成することが懸念される場合は、選択するオプションがあります。その場合、saveメソッドを乗り越える必要はありませんが、トリガー内に同じロジックを実装する必要があります。

関連する問題