我目前正在用Django编写一个站点(因为你永远不会学习太多的框架!),我想知道是否有一种方法可以让对象相对于相关的对象自动递增。例如,假设我有一个入口模型和一个EntryVersion模型:
入口
EntryVersion
外部key)
条目(
我希望针对条目外键自动递增version_number
(这样一个条目可能有多个版本,从一个版本开始,向上移动一个版本)。不过,它不是真正的自动递增,因为它在数据库中不是惟一的(可能有许多条目版本的version_number = 1;一个给定条目只有一个)。
我知道我可以启动我自己的管理员并在那里处理这个问题,但我想知道是否有任何方法可以让Django管理员在保存新的条目版本时自动将版本号加一。
编辑:我使用的特定代码(更正为仅在第一次保存时设置版本号)
蒂亚戈的回答是正确的,但为了将来有类似困境的StackOverflow用户的兴趣,下面是我使用的具体代码:
def save(self, force_insert=False, force_update=False):
# Only modify number if creating for the first time (is default 0)
if self.version_number == 0:
# Grab the highest current index (if it exists)
try:
recent = EntryVersion.objects.filter(entry__exact=self.entry).order_by('-version_number')[0]
self.version_number = recent.version_number + 1
except IndexError:
self.version_number = 1
# Call the "real" save() method
super(EntryVersion, self).save(force_insert, force_update)
order_by
w/ index技巧是我从下面的Django文档中收集到的:
http://docs.djangoproject.com/en/dev/topics/db/queries/#id4
请注意,您必须在version_number
字段上定义default=0
,这样才能正常工作。
也许有一种更好的方法,但这似乎完全符合我的需要;希望其他人也能发现它的用处。
发布于 2009-02-07 10:04:00
您可以这样做:
def save(self, force_insert=False, force_update=False):
#if self.id is None:
self.version_number += 1
super(EntryVersion, self).save(force_insert, force_update) # Call the "real" save() method.
它直接来自于这里:
http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods
https://stackoverflow.com/questions/522997
复制相似问题