我正在尝试使用graphene-django-optimizer
删除一些不必要的查询。在我收到此错误消息的某个字段之前,它工作得很好Field User.company cannot be both deferred and traversed using select_related at the same time
。此字段的唯一区别是它models.OneToOne
不是models.ForeignKey
. 为什么 Django 推迟这个字段?是否可以禁用延迟字段?
问问题
1451 次
1 回答
2
如果你这样做:
queryset.select_related('some_fk_field').only('another_field')
你可能会错过有冲突。你告诉 Django ORM 包含 some_fk_field,但你也告诉它限制查询只检索 another_field,所以它抱怨它不能这样做。您使用 .only() 绝对排除所有不详细的内容,但 .select_related() 试图做相反的事情,要求一些额外的元素。所以让它更清楚(这就是我发现的),这是处理这种情况的 Django 源代码:
if load_fields:
if field.attname not in load_fields:
if restricted and field.name in requested:
raise InvalidQuery("Field %s.%s cannot be both deferred"
" and traversed using select_related"
" at the same time." %
(field.model._meta.object_name, field.name))
来源: https ://docs.djangoproject.com/en/2.1/_modules/django/db/models/query_utils/
于 2021-03-05T14:07:09.057 回答