Django中操作Comment模型报错TypeError:无法将Comment转为整数的问询
Django TypeError: int() argument must be a string... 问题解析
你遇到的这个错误,核心原因非常明确:你在调用Comment.objects.get(id=comment.replyto)时,把整个Comment对象传给了id参数,但id字段需要的是整数类型的主键值,Django尝试将Comment对象转换为整数失败,因此抛出了这个TypeError。
错误细节拆解
看你出错的代码行:
comment.indent = Comment.objects.get(id=comment.replyto).indent + 1;
你的replyto是models.ForeignKey('self', ...)类型,所以当comment.replyto不为空时,它返回的是一个Comment实例对象,而非该对象的id值。你直接把这个对象传给id参数,Django内部会尝试将其转换为整数(因为id是IntegerField),这自然会触发类型转换错误。
修正方案
有两种简单的修正方式,优先推荐第一种:
方式1:直接使用关联对象的indent(最简洁高效)
既然comment.replyto已经是Comment对象了,完全不需要再去数据库查询一遍,直接访问它的indent字段即可:
for comment in all: if comment.replyto is not None: # 务必判断是否为空,避免触发AttributeError comment.indent = comment.replyto.indent + 1
方式2:通过id查询(不推荐,仅作知识补充)
如果一定要通过id去查询关联对象,需要传入comment.replyto的主键值,比如id或通用的pk:
for comment in all: if comment.replyto is not None: comment.indent = Comment.objects.get(id=comment.replyto.pk).indent + 1
这种方式会额外触发数据库查询,完全没必要,优先选择第一种方案。
额外优化建议:避免N+1查询问题
你的当前代码如果在循环中频繁触发数据库查询,会导致N+1查询问题(1次查询获取所有评论,N次查询获取每个评论的回复对象)。可以在初始查询时用select_related预加载关联的replyto对象,提升性能:
all = Comment.objects.filter( video=Video.objects.get(identifier=request.GET['identifier']) ).select_related('replyto').order_by('-uploaded')[:end]
这样循环时访问comment.replyto就不会再触发额外的数据库查询了。
内容的提问来源于stack exchange,提问作者BRHSM
相关产品推荐
相关产品推荐

