增加的CharField

时间:2016-12-27 14:15:16

标签: django python-3.x django-models

是否有可能定义一个增加的字段,但以字母开头?所以值应该是:S123,S1​​24,S125。

我想使用id字段,但有些原因我希望将它作为CharField。

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

id = models.CharField(max_length = 32, primary_key = True)

并重新定义了save方法,所以我总是预先计算它的值,但是这不是一个强大而不是“真正的”解决方案,而且我的解决方案在计算时也会太慢。

我的问题有适当的解决方案吗?

Django:1.9.2 Python:3.4.2

1 个答案:

答案 0 :(得分:2)

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

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

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.

如果你不知道,这里是对@property in python的解释。