在Django单元测试中如何在kwargs中使用UUID字段?
如何在Django视图和单元测试中使用UUID字段作为URL kwargs
嘿,作为刚接触Django单元测试的新手,这个问题其实挺常见的~我来一步步帮你搞定怎么在kwargs里用UUID字段:
第一步:让视图正确识别UUID参数
你的RetrieveABCAPIView应该是继承自DRF的RetrieveAPIView吧?其实DRF已经帮我们简化了UUID参数的处理,只需要简单配置一下:
from rest_framework.generics import RetrieveAPIView from .models import RandomModel class RetrieveABCAPIView(RetrieveAPIView): queryset = RandomModel.objects.all() # 关键!指定用unique_id作为查询字段,DRF会自动从URL kwargs里取对应的值 lookup_field = 'unique_id'
如果因为某些原因你需要手动处理kwargs(比如自定义查询逻辑),也可以重写get_object方法:
def get_object(self): # 从kwargs里取出UUID字符串 uuid_str = self.kwargs.get('unique_id') # 直接用字符串查询就行,Django的UUIDField会自动转换为UUID对象 return RandomModel.objects.get(unique_id=uuid_str)
第二步:单元测试中构造带UUID的请求
在单元测试里,你需要先创建测试数据,拿到目标对象的UUID,再构造对应的URL发起请求:
from django.test import TestCase from rest_framework.test import APIClient from .models import RandomModel, User, Course class RandomModelRetrieveTest(TestCase): def setUp(self): self.client = APIClient() # 先创建关联的User和Course实例 self.test_user = User.objects.create(username="test_user_1") self.test_course = Course.objects.create(name="Test Course") # 创建RandomModel实例,自动生成unique_id self.test_obj = RandomModel.objects.create( title="Test Title", parent_user=self.test_user, parent_course=self.test_course ) def test_retrieve_by_uuid(self): # 构造URL:把测试对象的UUID拼进去 url = f"/myPath/retrieve/{self.test_obj.unique_id}" # 发起GET请求 response = self.client.get(url) # 断言请求成功,返回数据正确 self.assertEqual(response.status_code, 200) self.assertEqual(response.data["title"], self.test_obj.title) # 注意:响应里的UUID是字符串,所以要和str(self.test_obj.unique_id)对比 self.assertEqual(response.data["unique_id"], str(self.test_obj.unique_id))
几个小提醒
- URL配置里的
<uuid:unique_id>已经帮我们做了格式校验,只有合法的UUID字符串才会匹配这个路由,不用担心非法参数。 - 如果手动处理UUID,不用特意把字符串转换成UUID对象,Django的ORM会自动处理字符串到UUID类型的转换。
- 单元测试里如果需要生成自定义UUID(而不是用模型自动生成的),可以用
uuid.uuid4()创建,然后在创建模型实例的时候传入:import uuid custom_uuid = uuid.uuid4() test_obj = RandomModel.objects.create( title="Custom UUID", parent_user=self.test_user, parent_course=self.test_course, unique_id=custom_uuid )
内容的提问来源于stack exchange,提问作者Swechchha Tiwari
相关产品推荐
相关产品推荐

