DRF中用APITestCase测试Model Serializer时遇属性错误求助
解决Django REST Framework序列化器测试中的HyperlinkedIdentityField上下文错误
嘿,我来帮你搞定这个问题!你遇到的两个错误其实根源是同一个:你传给序列化器的request根本不是真正的请求对象,而是一个404响应对象,这就导致了后续的连锁问题。
错误原因拆解
- 当你执行
request = client.get('/user/create/')时,返回的是HttpResponseNotFound(大概率是这个URL配置有误),这是服务器返回的响应,不是请求对象,它自然没有build_absolute_uri方法——而HyperlinkedIdentityField恰恰需要这个方法生成绝对URL链接。 - 如果你去掉
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
相关产品推荐
相关产品推荐

