我需要在Django的模型中执行类似form.save(commit = False)的操作

时间:2018-02-02 20:09:22

标签: python django

我有一个模型需要在创建时将ID包含在另一个字段中......见下文:

id = models.AutoField(primary_key=True)
ticket_number = models.CharField(max_length=200, blank=True)
brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True)

...

def save(self, *args, **kwargs):
    shortname = self.brand.shortname
    super(Job, self).save(*args, **kwargs)
    self.ticket_number = shortname.upper() + '-' + str(self.id)
    super(Job, self).save(*args, **kwargs)

它工作正常,并创建一个唯一的票号。我是Django的新手,但我知道我觉得两次保存帖子效率低下。对于模型,有类似.save(commit = False)的东西吗?我想每次保存只保存一次。

2 个答案:

答案 0 :(得分:0)

在创建相应的数据库行并且Django从那里提取它之前,你事先不能确切知道self.id是什么。如果您没有计划对列进行过滤,则只需将其转换为在模型实例上查找时计算的属性:

class Thing(db.Model):
    id = models.AutoField(primary_key=True)
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True)

    @property
    def ticket_number(self):
        return '{}-{}'.format(self.brand.shortname.upper(), self.id)

答案 1 :(得分:0)

您可以使用post_save信号更新票号。保存模型后会调用post_save信号,因此它将具有id。虽然,您仍将执行两次保存,但您只能显式调用一次。

发布保存文档:here 这将有希望给你更多的心理安宁=)。