2016-12-27 42 views
1

是否有任何可能性来定义一个字段得到递增,但以字母开头?所以这些值应该是这样的:S123,S1​​24,S125。增量CharField

我想使用它的id字段,但某些原因,我想将它作为CharField。

作为一种变通方法我可以使用:

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

,并重新定义的保存方法,所以我总是预先计算它的价值,但这“不会出现比‘真实’的解决方案,强大的,也是我的解决办法计算速度太慢。

有没有适合我的问题的解决方案?

Django的:1.9.2 的Python:3.4.2

+0

这可能是你感兴趣的:https://docs.djangoproject.com/es/1.9/ref/models/fields/#django.db.models.UUIDField – crystalAhmet

回答

2

我不认为你应该手动定义一个主键。 Django通常使用关系数据库来构建一个应用程序,这意味着它将依赖于其他表在需要时执行查找的其他表的一些关键字段。像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的解释。

+0

那么,作为最终解决方案,我添加了一个新的字段(c_id,CharField),并且我在post_save信号(当它被创建时)保持它的值。 – user2194805