Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过将自动字段与定义的字符Django连接而生成的值的字段_Django_Django Models - Fatal编程技术网

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

通过将自动字段与定义的字符Django连接而生成的值的字段,django,django-models,Django,Django Models,我希望在我的模型中有一个DjangoCharField,其值将通过连接固定值和自动生成值的值生成,例如值1:KAM001、值2:KAM002 我一直在想如何才能做到这一点。有很多方法可以回答你的问题。这实际上取决于此字段的用途以及您希望何时自动生成代码(保存记录之前或之后) 在下面的代码中,我定义了一个Charfield,它存储带有固定部分('KAM')和增量部分('001','002',…)的代码,这些部分都没有在别处定义过。 保存对象时,字段代码(如果为空)将以增量方式填充 class My

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


我一直在想如何才能做到这一点。

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

在下面的代码中,我定义了一个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
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
但是请注意,如果在保存第一个对象之前实例化了两个对象,那么这种方法可能会生成重复的值,因此我不鼓励您使用这种方法

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

e、 例如,如果您不需要基于“Charfield字段”执行查询,我建议您使用另一种方法:

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
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”部分),“保存时定义”方法是可行的。

自动生成的值是否已在另一个字段(即“pk”)中定义?不是真的,但我希望它能够工作,因此如果您有这样的建议,我很乐意在@furins中尝试