CharField
固定値と自動生成された値 (value1: KAM001、Value2:KAM002 など) を連結することによって値が生成されるDjangoをモデルに含めたいと考えています。
私はそれをどのように達成できるかにこだわっています。
CharField
固定値と自動生成された値 (value1: KAM001、Value2:KAM002 など) を連結することによって値が生成されるDjangoをモデルに含めたいと考えています。
私はそれをどのように達成できるかにこだわっています。
あなたの質問に答える方法はたくさんあります。これは、このフィールドの目的と、いつコードを自動生成するか (レコードが保存される前または後) によって異なります。
次のコードでは、固定部分 ('KAM') と増分部分 ('001'、'002'、...) を含むコードを格納する Charfield を定義しています。これらの部分はまだ他の場所で定義されていません。 オブジェクトが保存されると、フィールドcodeが空の場合、段階的に入力されます。
class MyModel(models.Model):
code = models.CharField(blank=True, default='')
def save(self, force_insert=False, force_update=False):
if self.code == "":
existing_codes = MyModel.objects.all().order_by('-code')
if existing_codes.count() > 0:
new_code = int(existing_codes[0].code[1:]) + 1
else:
new_code = 0
self.code = 'KAM%03d' % new_code
super(MyModel, self).save(force_insert, force_update)
文字列を自動インクリメント フィールドに連結する場合、コードは少し複雑ではありません。
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
code = models.CharField(blank=True, default='')
def save(self, force_insert=False, force_update=False):
self.code = 'KAM%08d' % self.id
super(MyModel, self).save(force_insert, force_update)
レコードを保存する前にコードを定義したい場合は、次の方法を使用できます。
class MyModel(models.Model):
code = models.CharField(blank=True, default=new_code)
@property
def new_code(self):
existing_codes = MyModel.objects.all().order_by('-code')
if existing_codes.count() > 0:
new_code = int(existing_codes[0].code[1:]) + 1
else:
new_code = 0
return 'KAM%03d' % new_code
ただし、最初のオブジェクトが保存される前に 2 つのオブジェクトがインスタンス化された場合、このアプローチでは重複する値が生成される可能性があることに注意してください。したがって、このアプローチを使用することはお勧めしません。
他のアプローチでは、シグナルやトリガーなどを使用する場合があります。これらは多くのほんの一部です。
たとえば、「Charfield フィールド」に基づいてクエリを実行する必要がない場合は、別の方法をお勧めします。
class MyModel(models.Model):
# ... your fields here
def my_code(self):
return 'KAM%08d'%self.pk # please note that I've added more padding zeroes
これは、次の方法でテンプレートから呼び出すことができます。
{{obj.my_code}}
obj は MyModel のインスタンスです
一部のレコードの最初の部分 (「KAM」部分) も変更する必要がある場合は、「保存時に定義する」アプローチが適しています。