【问题标题】:Django foreign key access in save() functionsave() 函数中的 Django 外键访问
【发布时间】:2010-09-23 08:25:02
【问题描述】:

这是我的代码:

class Publisher(models.Model):
    name = models.CharField(
            max_length = 200,
            unique = True,
    )

    url = models.URLField()

    def __unicode__(self):
        return self.name

    def save(self):
        pass

class Item(models.Model):
    publisher = models.ForeignKey(Publisher)

    name = models.CharField(
            max_length = 200,
    )

    code = models.CharField(
            max_length = 10,
    )

    def __unicode__(self):
        return self.name

我希望能够从 Publisher 保存功能访问每个项目。我该怎么做?

例如,我想在保存 Publisher 时将文本附加到与此 Publisher 关联的每个 Item 的 code 字段。

编辑: 当我尝试实施第一个解决方案时,我收到错误“'Publisher' object has no attribute 'item_set'”。显然我无法以这种方式访问​​它。还有其他线索吗?

编辑 2: 我发现发生的问题是,当我创建一个新的 Publisher 对象时,我内联添加了 Items。因此,当尝试保存发布者并访问项目时,它们不存在。

有没有办法解决这个问题?!

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您应该能够执行以下操作:

    def save(self, **kwargs):
        super(Publisher, self).save(**kwargs)
    
        for item in self.item_set.all():
            item.code = "%s - whatever" % item.code
    

    我不太喜欢你在这里做的事情,这不是将ItemPublisher 联系起来的好方法。你到底追求的是什么?

    【讨论】:

    • 哦,我真傻。外键关系属于item!我道歉。我正在编辑以反映正确的代码!
    • 大声笑,反正我就是这么读的。如果 ForeignKey 在 Item 中,我的答案将起作用。
    • 实际上,当我尝试应用此解决方案时,它不起作用!我收到错误“'Publisher' 对象没有属性 'item_set'”。
    • 是的,再看一遍你会遇到问题。当您第一次创建发布者时,它没有任何项目,而且它实际上也不存在,因此您必须事先保存它。我已经更新了我的答案。
    • 这行得通吗?我尝试了一些类似的东西,但我在第一次保存时无法获取相关对象,只有当我保存并重新保存它时,我才能第二次获取 ForeignKey 中的对象。有什么想法吗?
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2014-01-12
    • 2015-04-25
    • 2021-07-10
    • 2014-03-28
    • 2020-03-15
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多