【问题标题】:Is there a way to auto-increment a Django field with respect to a foreign key?有没有办法相对于外键自动增加 Django 字段?
【发布时间】:2010-10-06 02:21:33
【问题描述】:

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

参赛作品
- 标题
- 蛞蝓

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

请注意,您必须在您的 version_number 字段中定义 default=0 才能使其正常工作。

可能有更好的方法,但这似乎完全符合我的需要;希望其他人也会发现它有用。

【问题讨论】:

  • 我不确定我是否 100% 了解您的用例。你能在 Entry 的 save 方法中这样做吗?
  • 感谢分享您的解决方案。
  • 考虑到对同一个条目的并发请求,这个解决方案的安全性如何?

标签: django django-models django-admin


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 谢谢!显然,我需要添加更多的逻辑,而不仅仅是增加 version_number(因为它可能不会默认为最后一个版本号),但我认为这绝对是我需要前进的方向;也感谢您的链接,我在文档中没有注意到。
  • 我在一个项目中做了类似的事情,但我最终把逻辑放在了视图中,因为这样更简单,而且只有一种方法可以创建我的对象。
  • 我可能最终会迁移到视图,但我特别希望现在能够在管理员中使用此 Just Work(因为我处于非常早期的测试阶段并且没有任何编辑视图设置)。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2017-09-02
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2021-08-12
相关资源
最近更新 更多