Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种方法可以针对外键自动递增Django字段?_Django_Django Models_Django Admin - Fatal编程技术网

是否有一种方法可以针对外键自动递增Django字段?

是否有一种方法可以针对外键自动递增Django字段?,django,django-models,django-admin,Django,Django Models,Django Admin,我目前正在用Django编写一个站点(因为你永远也学不到太多框架!),我想知道是否有一种方法可以根据相关对象自动增加一个对象。例如,假设我有一个入口模型和一个入口版本模型: 条目 -标题 -鼻涕虫 入口版本 -输入(外键) -版本号 -内容 我想自动增加条目外键的版本号(这样一个条目可能有多个版本,从一个开始,向上移动一个)。但是,它不会是真正的自动增量,因为它在数据库中不是唯一的(可能有许多版本为1的条目版本;对于给定的条目只有一个) 我知道我可以使用自己的管理员并在那里处理这个问题,但我想知

我目前正在用Django编写一个站点(因为你永远也学不到太多框架!),我想知道是否有一种方法可以根据相关对象自动增加一个对象。例如,假设我有一个入口模型和一个入口版本模型:

条目
-标题
-鼻涕虫

入口版本
-输入(外键)
-版本号
-内容

我想自动增加条目外键的版本号(这样一个条目可能有多个版本,从一个开始,向上移动一个)。但是,它不会是真正的自动增量,因为它在数据库中不是唯一的(可能有许多版本为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%了解您的用例。您可以在条目的保存方法中执行此操作吗?感谢共享您的解决方案。如果对同一条目的并发请求,此解决方案有多安全?