Django4 ORM关联查询报Cannot resolve keyword 'fatura'错误排查
报错原因
Django ORM做跨关联查询时,双下划线前的关联名必须和模型中定义的关联字段名完全一致,不会自动按关联模型的类名小写做匹配。
你的Repasse模型中,和Fatura绑定的一对一关系字段名是id_fatura,不是fatura。执行Repasse.objects.filter(fatura__id = 9)时,ORM在Repasse的字段列表里找不到名为fatura的关联字段,直接触发字段解析错误。
正确写法
把查询条件里的关联名替换成实际定义的字段名即可,查询效果和你写的原生SQL完全一致:
r = Repasse.objects.filter(id_fatura__id = 9)
还有更简洁的等价写法:Django会为每个外键/一对一关联字段自动生成一个带_id后缀的属性,直接对应数据库里存储的关联主键值,不需要跨表关联就能查询:
r = Repasse.objects.filter(id_fatura_id = 9)
优化建议
如果觉得id_fatura__id的写法冗余,也不想每次写查询都带id前缀,可以调整模型字段定义,把字段名改成更符合Django惯例的fatura,通过db_column参数指定原有的数据库列名,不需要修改现有表结构和数据:
class Repasse(models.Model): id_contrato = models.ForeignKey(Contrato, on_delete=models.SET_NULL, blank=True, null=True) fatura = models.OneToOneField( Fatura, on_delete=models.SET_NULL, null=True, blank=True, db_column="id_fatura_id" # 映射原有数据库列,无需改表 ) valorrepasse = models.DecimalField(max_digits=9, decimal_places=2, null=True, blank=True)
调整后你最初写的Repasse.objects.filter(fatura__id = 9)就可以正常执行了。
内容的提问来源于stack exchange,提问作者mazzara
相关产品推荐
相关产品推荐

