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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:19:55