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
相关产品推荐
相关产品推荐

