2012-01-21 19 views
8

私は、新しいモデルをデータベースに保存するときにそのプライマリキーがインクリメントされるように、私のDjangoモデルを2つレイアウトする方法を理解しようとしています。同じ外部キーを持つすべてのレコードの次に高い値。外部キーに基づくDjangoモデルの自動インクリメントプライマリキー

これはthis question askedとよく似ていますが、私はDjangoでどのように行うのだろうかと思います。ここでは似たような状況を示している質問からの抜粋です:

id | job_id | title 
0  1  hi 
1  1  hello 
2  1  goodbye 
0  2  hi 
1  2  hello 

私はyou can't have multiple primary keys in a Django modelを知って、あなたはunique_togetherを使用することができますが、ドキュメントが、それはCREATE文で同等のUNIQUEステートメントを使用していますと言います。モデルで

class ModelA(models.Model): 
    key = models.PositiveIntegerField(primary_key = True) 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

は私が探しているものを達成するためにthis answerで動作しますか?モデル間の関係は、ModelBの数が多いModelAですが、それぞれModelBにはModelAの1つしかありません。

+1

最初の段落は解析されませんでした。 –

+0

@ IgnacioVazquez-Abrams、私は最初の段落を改め、例を追加しました。それは今より意味があるのですか? – Dirk

答えて

8

ダーク、モデルに若干の変更を加えなければなりません(許容される場合)Ignacioと言っています。したがって、ModelAは次のようになります。

class ModelA(models.Model): 
    key = models.PositiveIntegerField() 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

    def save(self, *args, **kwargs): 
     key = cal_key(self.fk) 
     self.key = key 
     super(ModelA, self).save(*args, **kwargs) 

あなたが見ることができる、として、私はfk as argumentを取る方法cal_keyからキー値を計算するoverridden the default save methodを持っています。したがって、以下のcal_keyメソッドをmodelsファイルで定義してください。

def cal_key(fk): 
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key',flat=True) 
    if present_keys: 
     return present_keys[0]+1 
    else: 
     return 0 

cal_keyの方法は、実際に必要なものを明確に示しています。

+0

Thanks Sandip。私はイグナシオの答えよりも移植性が高いので、あなたの答えに行った。 – Dirk

+0

アプリケーションがマルチスレッドの場合、同じキーを2つの異なる機能に割り当てようとするため、このソリューションはunique_together検証エラーを発生させる可能性がありますか? –

0

あなたはこれを試すことができます。

AutoFile 

あなたは詳細についてはhereを見つけることができます。

関連する問題