我有一个模型需要在创建时将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)的东西吗?我想每次保存只保存一次。
答案 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 这将有希望给你更多的心理安宁=)。