具有通过将自动字段与已定义字符Django连接而生成的值的字段

时间:2013-01-25 14:34:49

标签: django django-models

我希望在我的模型中有一个Django CharField,其值将通过连接固定值和自动生成值的值生成,例如value1:KAM001,Value2:KAM002 ...

我坚持如何实现这一点。

1 个答案:

答案 0 :(得分:2)

有很多方法可以回答您的问题。这实际上取决于该字段的用途是什么,以及何时需要自动生成代码(保存记录之前或之后)。

在下面的代码中,我定义了一个Charfield,用于存储具有固定部分(' KAM')和增量代码(' 001',' 002',...),这些部分都没有在其他地方定义过。 保存对象时,字段代码(如果为空)将逐步填充。

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

但请注意,如果在保存第一个对象之前实例化了两个对象,则此方法可能会生成重复值,因此我不鼓励您使用此方法。

其他方法可能会使用信号,触发器等。这些只是其中的一部分。

例如,如果你不需要根据" 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'部分)"定义保存"方法是要走的路。