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

DRF中用APITestCase测试Model Serializer时遇属性错误求助

解决Django REST Framework序列化器测试中的HyperlinkedIdentityField上下文错误

嘿,我来帮你搞定这个问题!你遇到的两个错误其实根源是同一个:你传给序列化器的request根本不是真正的请求对象,而是一个404响应对象,这就导致了后续的连锁问题。

错误原因拆解

  1. 当你执行request = client.get('/user/create/')时,返回的是HttpResponseNotFound(大概率是这个URL配置有误),这是服务器返回的响应,不是请求对象,它自然没有build_absolute_uri方法——而HyperlinkedIdentityField恰恰需要这个方法生成绝对URL链接。
  2. 如果你去掉context参数,序列化器又因为找不到生成超链接所需的request上下文,直接抛出AssertionError。

正确的解决方案

我们需要给序列化器传入一个有效的请求对象,这里推荐用DRF提供的APIRequestFactory来构造,它是专门用于测试的工具,可以生成符合要求的request对象:

from rest_framework.test import APIRequestFactory

class Usertest(APITestCase):
    def test_userprofile_create(self):
        # 创建用户和关联的profile
        user = User.objects.create(username='asghar', password='4411652A', email='ww@gmail.com')
        profile = UserProfile.objects.create(fullname='asghariiiiii', phonenumber='9121345432', address='bella', user=user)
        user.user_profile = profile
        
        # 用APIRequestFactory生成一个有效的GET请求对象
        factory = APIRequestFactory()
        # 这里的路径随便填就行,我们只需要request来生成绝对URL
        request = factory.get('/')
        
        # 把正确的request传入序列化器的context
        data = UserCreateSerializer(user, context={'request': request}).data
        
        # 执行后续的创建请求
        url = reverse('user-create')
        response_create = self.client.post(url, data)
        
        # 可添加你的断言逻辑,比如检查响应状态码
        self.assertEqual(response_create.status_code, 201)

额外小提示

  • 你原来的client.get('/user/create/')返回404,说明这个URL可能不正确,建议始终用reverse('user-create')获取正确路由,避免硬编码URL的错误。
  • 如果UserCreateSerializer里的HyperlinkedIdentityField不是必须的,也可以换成PrimaryKeyRelatedField,这样就不需要传入request上下文了;但如果要保持超链接风格,上面的方法最稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:24:54