You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django视图测试未更新模型:POST请求后字段未变更求助

Django测试失败:POST更新模型后断言不生效的解决办法

你遇到的这个问题其实挺典型的,看起来简单但容易踩坑——核心原因就是内存里的对象和数据库中的数据不同步。

咱们来拆解下:

  • 你测试一开始创建的new_club是存在内存里的对象;
  • 当你发送POST请求后,视图确实更新了数据库里的这条记录,但内存里的new_club并不会自动跟着刷新;
  • 所以你直接断言它的name字段,拿到的还是最开始创建时的旧值,自然就会报错。

而你的表单测试能成功,是因为调用add_club_form.save()时,这个方法会直接修改你传入的self.existing_club内存对象,所以之后断言能拿到更新后的值。但视图的POST请求是通过数据库操作更新的,不会影响你之前创建的内存对象。

给你两个常用的解决办法:

方法一:重新从数据库获取最新对象

直接通过主键重新查询数据库,拿到更新后的记录再做断言:

def test_edit_club_view(self):
    """ Test changes can be made to an existing club through a post request to the edit_club view. """
    new_club = Club.objects.create( name = "new club name unique" )
    self.client.post("/clubs/edit/{}/".format(new_club.pk), data = {"name": "edited_club_name"})
    # 重新从数据库拉取最新数据
    updated_club = Club.objects.get(pk=new_club.pk)
    self.assertEqual(updated_club.name, "edited_club_name")

方法二:用refresh_from_db()刷新内存对象

Django提供了refresh_from_db()方法,可以直接同步内存对象和数据库的最新数据,不用重新查询:

def test_edit_club_view(self):
    """ Test changes can be made to an existing club through a post request to the edit_club view. """
    new_club = Club.objects.create( name = "new club name unique" )
    self.client.post("/clubs/edit/{}/".format(new_club.pk), data = {"name": "edited_club_name"})
    # 刷新内存中的对象,同步数据库最新数据
    new_club.refresh_from_db()
    self.assertEqual(new_club.name, "edited_club_name")

两种方法都能解决问题,refresh_from_db()更便捷,重新查询则更直观易懂,你可以根据习惯选择。

内容的提问来源于stack exchange,提问作者RHSmith159

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:05:17