【问题标题】:Updating value on django model object does not update value on related foreign key model更新 django 模型对象上的值不会更新相关外键模型上的值
【发布时间】:2022-11-13 18:36:49
【问题描述】:

我有 2 个模型,House 和 Room,其中 Room 有 House 的外键:

class House(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50)

class Room(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=50)
    color = models.CharField(max_length=50)
    house = models.ForeignKey(House, on_delete=models.CASCADE, related_name='rooms')

当我运行以下测试时,由于某种原因颜色不匹配,即使 id 匹配。有人可以帮忙找出原因吗?

def test_color_change(self):
    h = House(name='new house')
    h.save()

    r = h.rooms.create(
        name='living room',
        color='blue'
    )
    r2 = h.rooms.get(name='living room')
    r2.color = 'green'
    r2.save()
    self.assertEqual(r.id, r2.id)
    self.assertEqual(r2.color, r.color)

我一直在查看 RelatedManager 的 django 文档,但一直无法弄清楚。我本来希望 r 和 r2 指向同一个对象,但显然它们不是。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    “r”包含一个 Room 的 Python 实例,它是在查询时使用从数据库中提取的数据创建的,它不是对数据库行的某种引用。当您通过将颜色更改为“绿色”来更新此行时,“r”变量不会更新。

    你的测试应该是:

    def test_color_change(self):
        h = House(name='new house')
        h.save()
    
        r = h.rooms.create(
            name='living room',
            color='blue'
        )
        r.color = 'green'
        r.save()
        r2 = h.rooms.get(name='living room')
        self.assertEqual(r.id, r2.id)
        self.assertEqual(r2.color, r.color)
    

    但是,我看不出这个测试应该达到什么目的,因为您实际上是在测试 ORM。

    【讨论】:

    • 测试只是为了说明我发现的困惑,但你的第一句话就把它弄明白了!
    • 亲爱的 Alombaros,我对你的 4 个答案投了赞成票,即我的 +40 声望 :) 我注意到几天以来你给出了很好的答案。
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多