gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:27:58 26 4
gpt4 key购买 nike

所以,我想知道是否有一种方法可以避免在 Python 中完成工作并使用数据库来完成以下模型的工作:

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

所以.. 是否可以在数据库中而不是在 Python 中执行 get_next_version_number 中的逻辑?如此处所示的更简单的示例? https://docs.djangoproject.com/en/1.7/ref/models/queries/#f-expressions

最佳答案

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

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

编辑:

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

制作DraftVersion模型的version字段AutoField而不是 PositiveSmallIntegerField。您可以将其设为主键或不设为主键,具体取决于哪个更符合您的需求。

关于python - 使用 Django F 表达式或 "extra"SQL 来增加基于其他相关对象的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com