4

CharField固定値と自動生成された値 (value1: KAM001、Value2:KAM002 など) を連結することによって値が生成されるDjangoをモデルに含めたいと考えています。

私はそれをどのように達成できるかにこだわっています。

4

1 に答える 1

3

あなたの質問に答える方法はたくさんあります。これは、このフィールドの目的と、いつコードを自動生成するか (レコードが保存される前または後) によって異なります。

次のコードでは、固定部分 ('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」部分) も変更する必要がある場合は、「保存時に定義する」アプローチが適しています。

于 2013-01-26T15:50:37.010 に答える