在这里,我正在为我的视图编写测试用例,但测试失败并出现以下错误。
django.db.utils.IntegrityError: 列"content_type_id"中的空值
违反非空约束 详细信息:失败的行包含 (31, permission_name_1, 空, perms1(。
我正在编写自己的角色模型,因为我需要更改Group
和User
模型的默认ManyToMany
关系。
class CreateRoleTest(APITestCase):
def setUp(self):
self.user = User.objects.create_user(username='username',password='passwprd@321',email='email@gmail.com')
self.permission = Permission.objects.create(name='permission_name',codename='perms')
self.client = APIClient()
def test_create(self):
url = reverse('roles:create_role')
data = {'user':self.user,'permissions':[self.permission.pk],'name':'role_name'}
response = self.client.post(url,data,format='json')
print(response.json())
return self.assertEqual(response.status_code,status.HTTP_201_CREATED)
class UpdateDeleteRoleTest(APITestCase):
def setUp(self) -> None:
self.client = APIClient()
self.user = User.objects.create_user(username='username1', password='passwprd@3211',
email='email@gmail.com1')
self.permission = Permission.objects.create(name='permission_name_1', codename='perms1')
self.role = Role.objects.create(name='role1',user=self.user,permissions=[self.permission.pk])
def test_update(self):
data = {'user':self.user,'permissions':[self.permission.pk],'name':'role_name2'}
url = reverse('roles:update_role',kwargs={'pk':self.role.pk})
response = self.client.put(url,data,format='json')
print(response.json())
return self.assertEqual(response.status_code,status.HTTP_200_OK)
models.py
class Role(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE)
name = models.CharField(max_length=255)
permissions = models.ManyToManyField(Permission)
created = models.DateTimeField(auto_now_add=True)
views.py
class CreateRole(CreateAPIView):
serializer_class = RoleSerializer
queryset = Role.objects.all()
class UpdateRole(UpdateAPIView):
serializer_class = RoleSerializer
queryset = Role.objects.all()
def put(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
好吧,它说它缺少content_type_id
列的值。 这是 Django 自动生成的列,用于跟踪您的模型。这条线很可能是有缺陷的。
self.permission = Permission.objects.create(name='permission_name_1', codename='perms1')
根据 Django 文档,如果您需要以编程方式创建权限(可以通过管理员创建权限,但这确实不适合测试(,您应该首先获得准确的生成content_type_id
,然后在创建权限时添加它。
content_type = ContentType.objects.get_for_model(Role)
self.permission = Permission.objects.create(name='permission_name_1', codename='perms1', content_type=content_type)
此外,测试功能不需要return self.assertEqual(**)
。 仅self.assertEqual(**)
就足够了。
将其导入 tests.py 文件
from django.contrib.contenttypes.models import ContentType
在创建用户之后和向用户添加权限之前添加此行解决了问题
ContentType.objects.clear_cache()