代码之家  ›  专栏  ›  技术社区  ›  One Crayon

有没有一种方法可以相对于外键自动递增Django字段?

  •  23
  • One Crayon  · 技术社区  · 17 年前

    我目前正在Django中编写一个网站(因为你永远不会学到太多的框架!),我想知道是否有一种方法可以相对于相关对象自动递增一个对象。例如,假设我有一个Entry模型和一个EntryVersion模型:

    条目
    -标题
    -蛞蝓

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

    我想自动递增 version_number 关于条目外键(这样一个条目可能有多个版本,从一个开始向上移动一个)。不过,这不会是真正的自动增量,因为它在数据库中不会是唯一的(可能有许多版本号=1的条目版本;给定条目只有一个版本)。

    我知道我可以滚动自己的管理员并在那里处理这个问题,但我想知道是否有任何方法可以让Django管理员在保存新条目版本时自动将版本号增加一个。


    编辑:我使用的特定代码(更正为仅在首次保存时设置版本号)

    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)
    

    这个 order_by w/index技巧是我从Django文档中收集到的:

    http://docs.djangoproject.com/en/dev/topics/db/queries/#id4

    请注意,您必须拥有 default=0 定义在您的 版本号 为了使其发挥作用。

    也许有更好的方法,但这似乎正是我所需要的;希望其他人也会发现它有用。

    1 回复  |  直到 17 年前
        1
  •  9
  •   Tiago    17 年前

    您可以这样做:

    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

    推荐文章