Django 递增CharField

Django 递增CharField,django,python-3.x,django-models,Django,Python 3.x,Django Models,是否有可能定义一个递增但以字母开头的字段?因此,这些值应该类似于:S123、S124、S125 我想使用id字段,但出于某种原因,我想将其作为CharField 作为解决方法,我可以使用: id = models.CharField(max_length = 32, primary_key = True) 并重新定义save方法,所以我总是预先计算它的值,但这不会比“真实”的解决方案更可靠,而且我的解决方案在计算时会太慢 我的问题有合适的解决办法吗 Django:1.9.2 Python:3.

是否有可能定义一个递增但以字母开头的字段?因此,这些值应该类似于:S123、S124、S125

我想使用id字段,但出于某种原因,我想将其作为CharField

作为解决方法,我可以使用:

id = models.CharField(max_length = 32, primary_key = True)
并重新定义save方法,所以我总是预先计算它的值,但这不会比“真实”的解决方案更可靠,而且我的解决方案在计算时会太慢

我的问题有合适的解决办法吗

Django:1.9.2 Python:3.4.2


.

我认为您不应该手动定义主键。Django通常使用关系数据库来构建应用程序,这意味着它将依赖一些关键字段来
连接
其他表,以便在需要时进行查找。拥有像
S123
这样的主键会使维护变得格外困难,因为您需要在其他表中存储与引用相同的内容

我建议将字母部分和数字分开存储。您可以使用默认的
id
字段django创建为数字部分,并创建自己的字段来存储字母部分。然后,您将使用property方法返回您想要的值。大致:

class Foo(models.Model):
    letter = models.CharField(max_length=1)

    @property
    def symbol(self):
        return '%s%s' % (self.letter, self.id)
然后你可以做:

foo = Foo.objects.create(letter='S')
print foo.symbol   # this would print S1, S2, etc.

如果您不知道,这里有一个解释。

这可能会让您感兴趣:作为最终解决方案,我添加了一个新字段(c_id,CharField),并在post_save信号(创建时)期间保持其值。