2016-04-26 9 views
1

実際のオブジェクトを保存せずに、特定のモデルの次のIDを「予約」する方法を探しています。私は何のために望んでいることは、いくつかのDjangoの機能があるということですhttps://gist.github.com/kissgyorgy/6110380Djangoはオブジェクトを作成せずにシーケンス内の次のIDを消費する方法を公開していますか?

:ここでは詳細な

def get_next_id(model_class): 
    from django.db import connection 
    cursor = connection.cursor() 
    cursor.execute("select nextval('%s_id_seq')" % \ 
        model_class._meta.db_table) 
    row = cursor.fetchone() 
    cursor.close() 
    return row[0] 

:私は、私は、この特定のpostgresのソリューションのように順序を照会するために、直接基礎となるデータベースに行くことができることを知っています私のためにdbレイヤーを抽象化します。私は運が嫌いですか?

答えて

0

The docs say:

あなたが保存()を呼び出す前に、その値は、データベースによって、ないジャンゴで計算されるので、IDの値は、どうなるかを指示する方法はありません。

データベースを直接照会することは唯一の方法と思われます。

でも、次のIDをクエリし、挿入する前に別のインスタンスが行を挿入し、すべてをトランザクションにラップしない限り、別のIDで終了するケースがあります。

+0

ええと、Postgresのnextval関数は私にとっては不可分性を扱いますが、自分のラッパーを使ってsqliteを処理する方法を見てみると、似たsqlite関数がないことに気付きました。たぶん、dbsがシーケンスの操作のレベルを変えることは、私が望む機能がDjangoに実装されていない理由です。ラット... – georgeofallages

関連する問題