2012-01-23 6 views
1

確かに、これはthis oneと非常によく似た質問ですが、私は以前に尋ねましたが、それに答えるのは非常にうれしいでしょう。1つのクエリで他のフィールドでself.idを使用する

プライマリキーを使用して別のフィールドにデータを入力してインスタンスを作成したいとします。 Tomita Yujiは2つのクエリを使用して解決策を提案しました(ところで、それは完璧に機能します)が、1つのクエリのみを使用してそれを達成できるかどうかを知りたいと思います。

雄二富田のソリューション:事前に

def save(self, *args, **kwargs): 
    add = not self.pk 
    super(MyModel, self).save(*args, **kwargs) 
    if add: 
     self.identification = str(self.id) 
     kwargs['force_insert'] = False # create() uses this, which causes error. 
     super(MyModel, self).save(*args, **kwargs) 

感謝。

+1

_ SQL挿入時に自動生成されたIDを参照するにはどうすればよいですか?見て! –

+0

「識別情報」を別に保管する必要があるのはなぜですか? – Thomas

+0

@Yuji:そうですね、それはすてきな修正です。 –

答えて

0

プライマリキーが自動的に増分する整数の場合は、SELECT MAX(id) FROM myTableをdbシェルから実行して次のキーを計算できます。またはdjango内で:

from django.db.models import Max 
next_key = MyTable.objects.aggregate(next=Max('id'))['next']+1 

この方法の問題は、行ロックを実装する必要があることです。他のプロセスがデータベースに追加する可能性があります。次のID値をとると、コードでIntegrityError例外が発生します。あなたの「2つの質問」の課題は解決されません。

より良い解決策は、非順次主キーを使用することです。これは通常UUIDです。 MySQLでは、UUID()関数を主キーとして使用できます。これにより、(合理的に)衝突がなく、一意であることが保証されます。ジャンゴで

UUIDフィールドの公式サポートは(patchが提出されました)が存在しませんが、あなたが使用することができますlotsofexamplesがあります。

このルートに進むと、任意のポイントでプライマリキーを生成し、クエリを実行せずにモデルに割り当てることができます。

+1

これは面白いですが、いずれも問題を解決したり、指定されたユースケースに対処していません。 – Thomas

関連する問題