【问题标题】:Using self.id to populate other fields in Django使用 self.id 填充 Django 中的其他字段
【发布时间】:2012-02-12 21:24:42
【问题描述】:

我正在尝试使用主键“id”填充名为“标识”的字段。但是,如您所知,在保存对象之前无法知道对象的“id”是什么。因此,我固执地这样做了:

def save(self, *args, **kwargs):
    super(Notifications, self).save(*args, **kwargs)
    self.identification = str(self.id)

有趣的是,这在控制台中有效:

>>>new = Notifications.objects.create( # some fields to be filled )
>>>new.identification
'3' (# or whatever number)

但是当我去我的模板检索这个对象时:

{% for each in notifications %}
  Identification: {{ each.identification }}
{% endfor %}

现实打击:

Identification: 

发生了什么?为什么它在控制台中工作而不是在模板中工作?您建议使用什么方法在其他字段中使用自动填充字段?

非常感谢!

【问题讨论】:

  • 出于好奇,你为什么要这样做?
  • 实现嵌套的 cmets 使用 1 作为父级,1.1、1.2 等用于子级,1.1.1 用于子级的子级等。这是 joomla 使用的系统。

标签: django django-models save


【解决方案1】:

问题是您没有将更改保存到数据库中。

它可以在终端中工作,因为该特定模型实例(python 对象 - 非常临时)具有属性 identification 填充。当您在视图或模板中访问它时,save() 方法尚未被调用,因此属性/字段为空白。

要使其正常工作,请在第一次保存后再次调用保存。此外,仅在模型创建时设置 id 可能是有意义的。在大多数情况下,每次初始保存一个额外的调用并不是什么大问题。

def save(self, *args, **kwargs):
    add = not self.pk
    super(MyModel, self).save(*args, **kwargs)
    if add:
        self.identification = str(self.id)
        kwargs['force_insert'] = False # create() uses this, which causes error.
        super(MyModel, self).save(*args, **kwargs)

【讨论】:

  • 感谢您的回答。嗯,是的,我想这就是问题所在。当您说我应该再次保存时,您的意思是在使用 save() 之后(无需修改),我检索对象以按照我想要的方式填充标识值吗?。
  • @RobertSmith:无论如何,你必须以某种方式将模型的更改保存到数据库中。一种方法是在确定自动生成的 ID 后再次调用 save()(更新后的帖子)。我不喜欢它的气味,但我不明白它为什么会引起问题。这不会是你的瓶颈。大概吧。
  • @RobertSmith,我不确定如何在插入过程中获取下一个自动 ID。我不会担心这两个查询,因为每次保存一次。可能有更容易解决的瓶颈......也就是说,如果您知道如何通过一个查询来解决这个问题,请告诉我。我很想听!
  • 我将尝试找出答案。如果我没有得到答案,我将在此处提交该问题。我会让你知道:-)。
  • add = True if not self.id else False 我想你可以写“add = not self.pk”
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 2017-06-03
  • 2012-06-26
相关资源
最近更新 更多