错误的可能原因:不能同时使用 select_related 延迟和遍历字段?

Ale*_*sey 6 django django-models

我正在尝试使用graphene-django-optimizer删除一些不必要的查询。它工作得很好,直到我收到此错误消息的某个字段Field User.company cannot be both deferred and traversed using select_related at the same time。与此字段的唯一区别是它models.OneToOne不是models.ForeignKey。为什么 Django 将这个字段推迟?是否可以禁用延迟字段?

Emi*_* M. 7

如果你这样做:

queryset.select_related('some_fk_field').only('another_field')
Run Code Online (Sandbox Code Playgroud)

您可能会忽略存在冲突。你告诉 Django ORM 包含 some_fk_field,但你也告诉它限制查询检索 another_field,所以它抱怨它不能这样做。您使用 .only() 绝对排除所有不详细的内容,但 .select_lated() 试图做相反的事情,要求一些额外的元素。为了让它更清楚(这就是我发现的),这里是处理这种情况的 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))
Run Code Online (Sandbox Code Playgroud)

来源: https://docs.djangoproject.com/en/2.1/_modules/django/db/models/query_utils/