使用Django F表达式或" extra" SQL基于其他相关对象增加字段值

时间:2015-05-06 23:58:09

标签: 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
    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中执行逻辑?如图所示,这是一个更简单的例子?https://docs.djangoproject.com/en/1.7/ref/models/queries/#f-expressions

1 个答案:

答案 0 :(得分:1)

在这种情况下,我不认为F表达是必要的。听起来这可以从 Postgres 中完成,如下所示:

  1. 创建跟踪版本的Version模型;它的主键字段将是一个自动递增序列,您可以将其用作版本号
  2. 当您想要创建新版本时(或通过纯SQL执行此操作),您可以通过Django代码中的模型save新版本
  3. DraftVersion的{​​{1}}字段更改为versionForeignKey型号
  4. 如果您想预览下一个版本号,那么就需要查询Version模型的最大值,然后添加一个,例如Version
  5. 修改

    另一种选择,根据您的要求,可能更容易/更灵活:

    制作Version.objects.all().aggregate(Max('version')) + 1模型AutoFieldversion字段,而不是DraftVersion。你可以把它作为主键,取决于哪种更适合你的需要。