【问题标题】:Django change foreign key data and saveDjango更改外键数据并保存
【发布时间】:2016-04-05 09:22:30
【问题描述】:

我有两个类似的模型

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

现在让我们说一下文章的对象

a=Article.objects.filter(id=1)
a=a[0]

我尝试更改撰写本文的作者的标题和电子邮件,所以我这样做了

a.heagline = "Saving foreign key does not work"
a.reporter.email = "changed@email.com"
a.save()

这会保存 Article 对象,但不会修改 Reporter。

我明确地必须这样做

a.reporter.save()

查看报告对象的更改。由于这是一个多对一关系,它还应该在保存时修改外键

我怎样才能通过调用childs save方法来保存父模型

【问题讨论】:

  • 我怎样才能通过调用childs保存方法来保存父模型
  • 没有直接的方法,但您始终可以覆盖子模型的save 方法。
  • 您可能可以覆盖孩子的保存方法来执行此操作,但这很浪费,并且可能会在某些时候给您带来问题。 为什么你想这样做?
  • 为什么你能做到这一点?如果您正在修改链接对象,您应该在该对象上执行save - 修改“从后台”似乎是非常非常的坏主意,并且将来您可能无法找出为什么您的对象是正在修改

标签: django orm foreign-key-relationship many-to-one


【解决方案1】:

您可以覆盖保存方法或创建自定义方法。

class Article(models.Model):

    ...

    # Overriding save
    def save(self, *args, **kwargs):
        self.reporter.save()
        super(Article, self).save(*args, **kwargs)

    # Creating a custom method 
    def save_related(self):
        self.reporter.save()
        self.save()

我建议您创建一个自定义方法,因为它不会在 save() 中引入意外行为

【讨论】:

  • 是的,但这只是为一些很可能只需要几个特定用例的东西创造了额外的工作。
  • @Sayse 完全同意,这就是我提出这两种方法的原因。
  • 我只是看不出真正的问题是什么,这样做并没有给你带来任何其他人都可以使用的额外代码行
  • @Sayse 恕我直言,仅仅因为做某事可能是个坏主意并不意味着我们不应该回答最初的问题。这些问题已在 cmets 中提出,由提问者得出自己的结论。
  • 没错,但从经验来看,这只会导致未来的问题,即 OP 必须在另一个 hack 之上添加一个 hack,以实现最初可用的功能。这通常可以通过花费额外的 5 分钟来解决他们实际询问的问题 (XY Problem)
猜你喜欢
  • 2011-04-26
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2022-06-18
  • 2017-05-10
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多