6

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

4

1 回答 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 回答