Django 如何创建自定义序列?
我希望执行自定义序列,例如: 如果它是数据库中的第一个对象,我将创建一个对象并将其命名为A001Django 如何创建自定义序列?,django,Django,我希望执行自定义序列,例如: 如果它是数据库中的第一个对象,我将创建一个对象并将其命名为A001 如果对象不断增加并达到A999,则名称将从B001重新开始。一旦它到达B999,它将再次从C001开始。我将在这里为您提供一个简单的解决方案,覆盖保存方法 假设我们有一个对象: import string class YourClass(models.Model): alph_counter = models.CharField(max_length=4, blank=True, null
如果对象不断增加并达到A999,则名称将从B001重新开始。一旦它到达B999,它将再次从C001开始。我将在这里为您提供一个简单的解决方案,覆盖
保存方法
假设我们有一个对象:
import string
class YourClass(models.Model):
alph_counter = models.CharField(max_length=4, blank=True, null=True, verbose_name=_(u'Alphabet Counter'))
def save(self, *args, **kwargs):
if self.__class__.objects.all().count() == 0:
# First object need to be set like this
letter = 'A'
number = 1
# %03d used to write the number with 2 zeros before
self.alphcounter = '%s%03d' (letter,number) # 'A001' this time
else:
# Get the last object ID
last_id = self.__class__.objects.all().order_by("-id")[0].id + 1
# We need to know wich letter is it, we use division over ID
wich_letter = (last_id+1) / 1000
letter = string.uppercasecase( wich_letter )
number = (last_id+1) % 1000
self.alphcounter = '%s%03d' (letter,number)
super(self.__class__, self).save(*args, **kwargs)
你试了什么?您的问题是什么?如果form.valid()
,您可以在CreateView
(或一些def
)上执行此操作。或通过post\u save
信号<代码>chr(ord('A')+1)='B'
。或者你在哪里被代码卡住了?@madzohan是的,我正在做post_save signal中的chr(ord('A')+1)。谢谢Liarez,如果我想做9999而不是999,你可以在(last_id+1)/1000和(last_id+1)%1000中把1.000换成10.000,并将%04d
的所有%03d
和CharFieldalph_计数器的最大长度从4更改为5!