Django 2.2中M2M字段用字符串类定义时反向关联过滤失败原因咨询
Django 2.2多对多字段字符串引用反向关联过滤失败问题
在使用Django 2.2时遇到以下异常:当通过字符串引用模型类定义多对多(ManyToManyField)字段的反向关联时,执行过滤操作会失败;但直接传入模型类定义时,过滤操作可正常执行。
失败代码示例
class Whatever(models.Model): providers = models.ManyToManyField('Relation', related_name='dependants')
正常代码示例
from .relation import Relation class Whatever(models.Model): providers = models.ManyToManyField(Relation, related_name='dependants')
两者仅有的区别是多对多字段声明时使用字符串还是直接传入模型类。使用字符串定义关联模型时,执行Relation.objects.filter(dependants=1)会抛出如下错误:
FieldError: Cannot resolve keyword 'dependants' into field. Choices are: ...
错误提示中没有dependants选项,说明该反向关联字段无法被查询识别,但直接通过实例访问r.dependants(r = Relation.objects.first())却可以正常工作。
导入模型类虽然能解决问题,但会失去用字符串引用解决循环依赖的优势。现咨询:该问题是Django已知Bug且后续版本已修复,还是字符串指定模型类的固有局限?
已尝试的无效解决方法
- 简化模型,移除自定义管理器或查询集相关逻辑
- 使用完整限定模型名字符串,如
'appname.Relation' - 重写字段及related_name以避免内部冲突
- 重建并运行迁移
- 修改查询语句为
Relation.objects.filter(dependants__id=1)
内容的提问来源于stack exchange,提问作者SpliFF
相关产品推荐
相关产品推荐

