是否有一种方法可以针对外键自动递增Django字段?
我目前正在用Django编写一个站点(因为你永远也学不到太多框架!),我想知道是否有一种方法可以根据相关对象自动增加一个对象。例如,假设我有一个入口模型和一个入口版本模型: 条目是否有一种方法可以针对外键自动递增Django字段?,django,django-models,django-admin,Django,Django Models,Django Admin,我目前正在用Django编写一个站点(因为你永远也学不到太多框架!),我想知道是否有一种方法可以根据相关对象自动增加一个对象。例如,假设我有一个入口模型和一个入口版本模型: 条目 -标题 -鼻涕虫 入口版本 -输入(外键) -版本号 -内容 我想自动增加条目外键的版本号(这样一个条目可能有多个版本,从一个开始,向上移动一个)。但是,它不会是真正的自动增量,因为它在数据库中不是唯一的(可能有许多版本为1的条目版本;对于给定的条目只有一个) 我知道我可以使用自己的管理员并在那里处理这个问题,但我想知
-标题
-鼻涕虫 入口版本
-输入(外键)
-版本号
-内容 我想自动增加条目外键的版本号(这样一个条目可能有多个版本,从一个开始,向上移动一个)。但是,它不会是真正的自动增量,因为它在数据库中不是唯一的(可能有许多版本为1的条目版本;对于给定的条目只有一个) 我知道我可以使用自己的管理员并在那里处理这个问题,但我想知道是否有任何方法可以让Django管理员在保存新条目版本时自动将版本号增加1
编辑:我使用的特定代码(更正为仅在第一次保存时设置版本号) Tiago的回答是正确的,但为了将来遇到类似困境的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)
我从Django文档中收集到的order\u by
w/index技巧如下:
请注意,必须在version\u number
字段中定义default=0
,才能使其工作
也许有更好的办法,但这似乎正是我所需要的;希望其他人也会发现它很有用。您可以这样做:
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.
直接来自这里:
谢谢!显然,我需要添加更多的逻辑,而不仅仅是增加版本号(因为它可能不会默认为最后一个版本号),但我认为这绝对是我需要朝的方向;同样感谢您的链接,我没有注意到文档中有这样的内容。我在一个项目中做了类似的事情,但我最终将逻辑放在了视图中,因为这样更简单,并且只有一个方法可以创建我的对象。我可能最终迁移到视图中,但我特别希望现在就能够在管理中实现这一点(因为我处于非常早期的测试阶段,还没有设置任何编辑视图)。再次感谢!我不确定我是否100%了解您的用例。您可以在条目的保存方法中执行此操作吗?感谢共享您的解决方案。如果对同一条目的并发请求,此解决方案有多安全?