解决Django中'int()基数10无效字面量'错误(目标值为字符串)
解决"invalid literal for int() with base 10"错误:外键过滤误用字符串而非对象
兄弟,这个错误的根源太明显了——你在Accelerator的avg_rating属性里,试图用self.name(字符串)去过滤Review模型的subject外键字段,但外键字段底层存储的是关联对象的整数ID,Django看到你传了个字符串,会自动尝试把它转成整数用来匹配ID,这就直接触发了ValueError。
修正后的代码
直接把过滤条件改成传入当前Accelerator实例就行,Django会自动处理ID匹配:
class Accelerator(models.Model): # ... 你的其他字段定义 @property def avg_rating(self): # 替换subject=self.name为subject=self aggregate_result = Review.objects.filter(subject=self).aggregate(avg_rating=Avg('overall')) avg_rating = aggregate_result['avg_rating'] # 先判断是否为None,再处理默认值 return avg_rating if avg_rating is not None and avg_rating > 0 else 0
为什么之前的代码会报错?
Review模型里的subject是ForeignKey(Accelerator),这意味着它关联的是整个Accelerator对象,而不是对象的name字段。当你用subject=self.name时,Django会把这个字符串当作ID来解析,自然就会出现"无法把字符串转成整数"的错误。
额外提醒
如果你真的需要通过name字段来过滤(非常不推荐,因为名称可能重复),那得用双下划线的字段查找语法:
Review.objects.filter(subject__name=self.name)...
但显然直接用subject=self更高效、更准确,完全没必要绕远路。
内容的提问来源于stack exchange,提问作者samalty
相关产品推荐
相关产品推荐

