所以,我想知道是否有办法避免在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
答案 0 :(得分:1)
在这种情况下,我不认为F
表达是必要的。听起来这可以从 Postgres 中完成,如下所示:
Version
模型;它的主键字段将是一个自动递增序列,您可以将其用作版本号save
新版本DraftVersion
的{{1}}字段更改为version
到ForeignKey
型号Version
模型的最大值,然后添加一个,例如Version
修改强>
另一种选择,根据您的要求,可能更容易/更灵活:
制作Version.objects.all().aggregate(Max('version')) + 1
模型AutoField
的version
字段,而不是DraftVersion
。你可以把它作为主键,取决于哪种更适合你的需要。