Python 使用Django F表达式或;额外的;SQL根据其他相关对象增加字段的值
因此,我想知道是否有一种方法可以避免在Python中进行工作,并使用DB对以下模型进行工作: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
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
表达式。听起来这可以从博士后内部实现,如下所示:
版本
模型;它的主键字段将是一个可以用作版本号的自动递增序列保存一个新版本
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
执行此操作。