Django后台创建Post对象时出现'int'无len()方法错误如何解决?
Django Admin创建Post对象时触发
len()调用错误:对整数执行字符串操作 错误本质
对整数调用了仅适用于字符串/可迭代对象的len()函数,报错栈关键信息如下:
C:\Users\callu\PycharmProjects\DjangoTests\venv\Lib\site-packages\django\forms\boundfield.py, line 162, in _has_changed return field.has_changed(initial_value, self.data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ … Local vars C:\Users\callu\PycharmProjects\DjangoTests\venv\Lib\site-packages\django\forms\models.py, line 1650, in has_changed if len(initial) != len(data): ^^^^^^^^^^^^
触发场景
仅在Django Admin后台创建Post对象时抛出该错误,前端表单创建Post可正常执行。
Post模型代码
class Post(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, default=None, null=True) title = models.CharField(max_length=100) slug = models.SlugField(blank=True) description = models.TextField(max_length=500) date = models.DateTimeField(auto_now_add=True) url_link = models.URLField(default=None, blank=True) likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="post_support", default=0, blank=True) tags = models.ManyToManyField(Tag, blank=True) class Meta: ordering = ('-date',) def __str__(self): return self.title def get_absolute_url(self): return reverse("posts:post_detail", args=(str(self.id),))
问题定位与解决方案
问题出在likes字段的配置上:ManyToManyField不能设置default=0。
ManyToManyField的默认值应为可迭代对象(如空列表)或None,你设置的整数0不符合字段要求。当Django Admin的ModelForm处理该字段时,会将0作为初始值传入has_changed方法,该方法尝试调用len(initial)时,就会因0是整数而触发错误。前端表单未处理该字段的初始值逻辑,因此未触发报错。
修复步骤:
- 移除
likes字段的default=0参数,保留blank=True即可(ManyToManyField默认是空关联集合):likes = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="post_support", blank=True) - 执行数据库迁移(移除无效参数无需修改表结构,但建议执行以同步配置):
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者Callum
相关产品推荐
相关产品推荐

