You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:30:39