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

swvgeqrz  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(151)

我正在尝试使用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?是否可以禁用正在延迟的字段?

snvhrwxg

snvhrwxg1#

如果您这样做:

queryset.select_related('some_fk_field').only('another_field')

你可能会忽略其中的冲突。你告诉Django ORM包含一些_fk_field,但你也告诉它限制查询 only 检索另一个_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/

oxf4rvwz

oxf4rvwz2#

补充Emilio所说的,要解决这个问题,查询应该重新安排为

queryset.select_related('some_fk_field').only('another_field', 'some_fk_field')

.only()告诉django只取出some_fk_fieldanother_field,然后因为some_fk_field是外键,所以select_related()也取出some_fk_field对象,这修复了你得到的错误

相关问题