【问题标题】:I need to do something like form.save(commit=False) in my model in Django我需要在 Django 的模型中执行类似 form.save(commit=False) 的操作
【发布时间】:2018-02-02 20:09:22
【问题描述】:

我有一个模型需要在创建时将 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) 的东西吗?我希望每次保存只保存一次。

【问题讨论】:

  • 这根本没有意义。如果它存在,它会做什么?无论如何,数据库都负责设置 id 那么这有什么帮助呢?

标签: python django


【解决方案1】:

在创建相应的数据库行并且 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)

【讨论】:

  • 效果很好,但我可能无法使用它。我们需要一种方法让人们能够通过工作编号进行搜索。我猜这很容易在前端实现,所以我会检查一下。
  • @brunam:执行两次保存可能比重新编写代码以避免它们更简单。
【解决方案2】:

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

保存后文档:here 这有望给你更多的精神平静=)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多