2016-12-19 9 views
2

私たちはOracleデータベースを移行し、必要な変更を行っていますが、主な変更点は、すべてのモデル(クライアントに隠されている)にUUIDFieldをprimary_keyとして追加し、標準AutoFieldDjango non primary_key AutoField

私たちは、お客様に直接PRIMARY_KEYを表示することは良いデザインではないことがわかったが、彼らはまた、IDフィールドを要求し、より簡単にオブジェクトを参照するために表示されますが、DjangoはAutoFieldがPRIMARY_KEY

されないようにできないことで、これを制限

この問題の回避策はありますか?

答えて

2

私は仕事ができると思うことは(ほとんどAutoFieldは、ボンネットの下に使用するもの)IntegerFieldを使用して、そして(それは今までにデータベースに入れています前に)モデルの最初のセーブでこれをインクリメントされます。

私は、これを以下に示す例モデルを作成しました。

from django.db import models 

class MyModel(models.Model): 

    # This is what you would increment on save 
    # Default this to one as a starting point 
    display_id = models.IntegerField(default=1) 

    # Rest of your model data 

    def save(self, *args, **kwargs): 
     # This means that the model isn't saved to the database yet 
     if self._state.adding: 
      # Get the maximum display_id value from the database 
      last_id = self.objects.all().aggregate(largest=models.Max('display_id'))['largest'] 

      # aggregate can return None! Check it first. 
      # If it isn't none, just use the last ID specified (which should be the greatest) and add one to it 
      if last_id is not None: 
       self.display_id = last_id + 1 

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

これは、理論的には、ただ単に異なるモデルフィールドで、AutoFieldが何を複製します。

+0

これは、モデルの最初の保存でのみトリガーになるのですか? – Mojimi

+1

@Mojimi、私はちょうど方法でバグだったので、私は私の答えを更新しました。プライマリキーが存在しないかどうかを確認するには、 'AutoField'プライマリキーでは動作しますが、' UUIDField'では動作しません。しかし、Django自体には '_state'と' adding'フィールドがあります。このオブジェクトが作成されていて、更新されていない場合は 'True'を返します。これはモデルが最初に保存/作成されていることを意味します。それについての謝罪:) – Tinfoilboy

+0

しばらくすると、私はこれが別のやり方でできるかどうか、上記のコードとほぼ同じコードを持つ関数にデフォルト値を代入し、ラムダを使ってモデルをパラメータとして渡すことによって考えていましたこれにより、すべてのモデルのsaveメソッドを上書きする必要がなくなります。 – Mojimi

関連する問題