我想为Django中的模型制作一个简单的ID计数器。我希望它从1000开始而不是0,所以我想最好不要使用built in id function,因为我在这里尝试这样做:
def __str__(self):
return "Job #" + str(id)
这(以及涉及编写函数的所有其他尝试)仅返回如下内容:
Job #<built-in function id>
也许以某种方式使用for循环会更容易吗?
答案 0 :(得分:1)
Python有一个名为id
[Python-doc]的 builtin 函数。它为给定对象计算一个数字,该数字在对象的整个生命周期内保持不变,并且 unique 也是如此。
因此,如果您在函数中使用id
,而没有声明名为id
的局部变量(或更局部范围的变量)。名称id
的查找将导致此功能。
但是您在这里想要的是对象的id
:self
对象。因此,您需要改用self.id
:
def __str__(self):
return "Job #" + str(self.id)
或更干净的格式:
def __str__(self):
return "Job #{}".format(self.id)
由于不能保证模型具有id
列(因为可以定义另一个主键),因此使用.pk
可能更安全:
def __str__(self):
return "Job #{}".format(self.pk)
关于启动主键,对此有一些疑问(包括答案),例如this和this。但要注意的是,这些通常是自动递增的字段,并且用于分配ID的序列通常与数据库有关。结果,没有直接的方法来解决此问题,因为某些数据库系统在启动时会计算分配的id
中的最大值,然后每次分配下一个。尽管存在一些解决方案,但这些解决方案通常不是 generic ,并且另一个数据库后端可能会有所不同。