我正在尝试使用graphene-django-optimizer
删除一些不必要的查询。它工作得很好,直到某个字段,我得到这个错误消息Field User.company cannot be both deferred and traversed using select_related at the same time
。与此字段的唯一区别是它是models.OneToOne
而不是models.ForeignKey
。为什么Django将此字段设置为delayed?是否可以禁用正在延迟的字段?
2条答案
按热度按时间snvhrwxg1#
如果您这样做:
你可能会忽略其中的冲突。你告诉Django ORM包含一些_fk_field,但你也告诉它限制查询 only 检索另一个_field,所以它抱怨它不能这样做。你使用.only()来完全排除所有不详细的内容,但是.select_related()试图做相反的事情,要求一些额外的元素。为了让它更清楚(这就是我发现的),这里是处理这种情况的Django源代码:
来源:https://docs.djangoproject.com/en/2.1/_modules/django/db/models/query_utils/
oxf4rvwz2#
补充Emilio所说的,要解决这个问题,查询应该重新安排为
.only()
告诉django只取出some_fk_field
和another_field
,然后因为some_fk_field
是外键,所以select_related()
也取出some_fk_field
对象,这修复了你得到的错误