gpt4 book ai didi

django - 具有通过将自动字段与定义的字符 Django 连接起来生成的值的字段

转载 作者:行者123 更新时间:2023-12-01 02:28:40 24 4
gpt4 key购买 nike

我想要一个 Django CharField在我的模型中,其值将通过连接固定值和自动生成值的值来生成,例如 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”部分),则“保存时定义”方法是可行的方法。

关于django - 具有通过将自动字段与定义的字符 Django 连接起来生成的值的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14523923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com