Django filter外键筛选报invalid literal for int() with base 10错误如何解决
错误原因
Django 外键默认指向关联模型的主键,你在report_table中定义的cn_number外键指向Master_table,所以该字段实际存储的是Master_table的sl_no(整数类型主键)的值。你在filter语句中给cn_number字段传入了Master_table_data.cn_number这个字符串类型的值(报错信息中的USS2000203就是该字段的值),Django 尝试把字符串转换为整数匹配主键,自然就会抛出转换失败的错误。
解决方案
有两种常用修正方式,按需选择即可:
方案1:直接传入主表实例筛选
外键字段筛选可以直接传入关联的模型实例,不需要手动取字段,Django会自动匹配主键:
def any_view(request): Master_table_data=Master_table.objects.get(sl_no=request.GET['key']) # 直接传主表实例即可 report_table_data=report_table.objects.filter(cn_number=Master_table_data)
方案2:显式关联主表字段筛选
如果你确实需要通过主表的cn_number字符串字段筛选子表记录,要使用双下划线做跨表关联查询:
def any_view(request): Master_table_data=Master_table.objects.get(sl_no=request.GET['key']) # 双下划线表示访问外键关联的主表对应字段 report_table_data=report_table.objects.filter(cn_number__cn_number=Master_table_data.cn_number)
额外优化建议
你当前的外键命名容易产生混淆:report_table里的外键字段叫cn_number,但实际存储的是主表的sl_no主键,而非cn_number字符串,建议改名避免后续踩坑,比如修改为master:
class report_table( models.Model ): master = models.ForeignKey(Master_table, on_delete=models.CASCADE) remarks = models.CharField( max_length=20, null=False )
后续筛选逻辑会更清晰:report_table.objects.filter(master=master_instance)
内容的提问来源于stack exchange,提问作者Ramesh Kumar
相关产品推荐
相关产品推荐

