私は仕事ができると思うことは(ほとんど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
が何を複製します。
これは、モデルの最初の保存でのみトリガーになるのですか? – Mojimi
@Mojimi、私はちょうど方法でバグだったので、私は私の答えを更新しました。プライマリキーが存在しないかどうかを確認するには、 'AutoField'プライマリキーでは動作しますが、' UUIDField'では動作しません。しかし、Django自体には '_state'と' adding'フィールドがあります。このオブジェクトが作成されていて、更新されていない場合は 'True'を返します。これはモデルが最初に保存/作成されていることを意味します。それについての謝罪:) – Tinfoilboy
しばらくすると、私はこれが別のやり方でできるかどうか、上記のコードとほぼ同じコードを持つ関数にデフォルト値を代入し、ラムダを使ってモデルをパラメータとして渡すことによって考えていましたこれにより、すべてのモデルのsaveメソッドを上書きする必要がなくなります。 – Mojimi