Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 - Fatal编程技术网

Django 如何创建自定义序列?

Django 如何创建自定义序列?,django,Django,我希望执行自定义序列,例如: 如果它是数据库中的第一个对象,我将创建一个对象并将其命名为A001 如果对象不断增加并达到A999,则名称将从B001重新开始。一旦它到达B999,它将再次从C001开始。我将在这里为您提供一个简单的解决方案,覆盖保存方法 假设我们有一个对象: import string class YourClass(models.Model): alph_counter = models.CharField(max_length=4, blank=True, null

我希望执行自定义序列,例如:

如果它是数据库中的第一个对象,我将创建一个对象并将其命名为A001


如果对象不断增加并达到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
和CharField
alph_计数器的最大长度从4更改为5!