我想CharField
在我的模型中有一个 Django,其值将通过连接固定值和自动生成值的值来生成,例如 value1: KAM001, Value2:KAM002 ...
我坚持如何实现这一目标。
我想CharField
在我的模型中有一个 Django,其值将通过连接固定值和自动生成值的值来生成,例如 value1: KAM001, Value2: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
但请注意,如果在保存第一个对象之前实例化了两个对象,则此方法可能会生成重复值,因此我不鼓励您使用此方法。
其他方法可能使用信号、触发器等。这些只是众多方法中的一部分。
例如,如果您不需要基于“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”部分),“保存时定义”方法是可行的方法。