Django测试报错TypeError: Field 'id'期望数字却得到()求解决
Django Model 创建实例时的Field 'id' 错误求助
我在代码中三次遇到该错误,已查阅相关问题但未找到可行解决方案,恳请各位提供解决思路。
相关代码
models.py
class Exam(models.Model): code = models.CharField(max_length=50) name = models.CharField(max_length=100) semester = models.IntegerField(default=1) year = models.CharField(max_length=9) users = models.ManyToManyField(User, blank=True) def __init__(self, *args, **kwargs): super().__init__(args, kwargs) self.questions = None
test_models.py
class ExamModelTestCase(TestCase): def setUp(self): self.user = User.objects.create(username='test_user', first_name='Test', last_name='User') self.exam = Exam.objects.create(code="EXAM1", name="Exam 1", semester=1, year="2024") def test_exam_str_method(self): self.assertEqual(str(self.exam), "EXAM1-Exam 1 2024 1")
错误信息
Found 12 test(s). Creating test database for alias 'default'... System check identified no issues (0 silenced). .....EEEEEE. ====================================================================== ERROR: test_exam_str_method (examc_app.tests.test_models.ExamModelTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/lucile/examreview/venv/lib/python3.10/site-packages/django/db/models/fields/__init__.py", line 2053, in get_prep_value return int(value) TypeError: int() argument must be a string, a bytes-like object or a real number, not 'tuple' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/lucile/examreview/examc_app/tests/test_models.py", line 9, in setUp self.exam = Exam.objects.create(code="EXAM1", name="Exam 1", semester=1, year="2024") TypeError: Field 'id' expected a number but got ().
解决思路
问题出在Exam类的__init__方法里:调用父类构造函数时,你直接传递了args和kwargs,没有对它们进行解包。Django的Model构造函数需要接收展开后的位置参数和关键字参数,直接传元组和字典会导致参数格式错误,进而让id字段无法正确初始化,出现空元组的错误。
修改models.py中的__init__方法,给args和kwargs加上解包运算符:
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 添加*和**解包参数 self.questions = None
这样修改后,Django就能正确处理初始化参数,正常创建Exam实例,测试也能顺利运行了。
内容的提问来源于stack exchange,提问作者TheGoldenKiwi2
相关产品推荐
相关产品推荐

