Python 使用Django F表达式或;额外的;SQL根据其他相关对象增加字段的值

Python 使用Django F表达式或;额外的;SQL根据其他相关对象增加字段的值,python,django,postgresql,Python,Django,Postgresql,因此,我想知道是否有一种方法可以避免在Python中进行工作,并使用DB对以下模型进行工作: class Draft(models.Model): # identity fields current_version = models.OneToOneField('app.models.DraftVersion') class DraftVersion(models.Model): # fields which change from version to version

因此,我想知道是否有一种方法可以避免在Python中进行工作,并使用DB对以下模型进行工作:

class Draft(models.Model):
    # identity fields
    current_version = models.OneToOneField('app.models.DraftVersion')

class DraftVersion(models.Model):
    # fields which change from version to version
    objects = DraftVersionManager()
    draft = models.ForeignKey(Draft)
    version = models.PositiveSmallIntegerField(default=1)

    class Meta:
        unique_together = ('draft', 'version')


class DraftVersionManager(models.Manager):
    def get_next_version_number(self, draft):
        try:
            return self.filter(draft=draft).order_by('-version')[0].version + 1
        except IndexError:
            return 1

所以。。是否可以在db中而不是在Python中执行get_next_version_number中的逻辑?这里显示了一个更简单的示例

我认为在这种情况下不需要
F
表达式。听起来这可以从博士后内部实现,如下所示:

  • 创建跟踪版本的
    版本
    模型;它的主键字段将是一个可以用作版本号的自动递增序列
  • 当您想要创建一个新版本(或通过纯SQL)时,您可以通过Django代码中的模型
    保存一个新版本
  • DraftVersion
    version
    字段更改为
    ForeignKey
    到您的
    版本
    型号
  • 如果要预览下一个版本号,则需要查询
    version
    模型的最大版本号,然后添加一个,例如
    version.objects.all().aggregate(max('version'))+1
  • 编辑:

    另一个选项可能更容易/更灵活,具体取决于您的要求:


    DraftVersion
    模型的
    version
    字段改为
    PositiveSmallIntegerField
    。您可以将它设置为主键,也可以不设置,这取决于哪个更适合您的需要。

    我认为这不起作用,因为我相信只有主键可以自动递增。除非kevins同意所有文档的全局唯一版本号。从Postgres的角度来看,任何字段都可以自动递增。Django也是如此,在Django中,一个字段可以变成一个
    自动字段,而不必是主键()。是的,我认为这行不通。我希望为每个草稿重置版本号。所以,草稿的第一个版本是1,然后是2,然后是3。。我的问题的另一点是将逻辑移到数据库中。我所展示的工作原理与此相同,只是计算是用Python完成的,首先你必须从数据库中获取最高的版本号。通过“重置”,你的示例听起来是指自动递增,所以在这种情况下,我不确定为什么将其设置为
    自动字段
    不起作用。。。然后是Postgres在每次创建新的
    DraftVersion
    时处理版本号,您可能会对每个新的
    Draft
    执行此操作。