I am trying to use graphene-django-optimizer to remove some of the unnecessary queries. It worked quite well until one certain field where I get this error message Field User.company cannot be both deferred and traversed using select_related at the same time. The only difference with this field is that it is models.OneToOne instead of models.ForeignKey. Why Django make this field deferred? Is it possible to disable field being deferred?
If you do this:
queryset.select_related('some_fk_field').only('another_field')
You may miss that there is a conflict. You are telling Django ORM to include some_fk_field, but you are also telling it to limit the query to only retrieve another_field, so it complains it can't do it. You use .only() to exclude absolutely everything that is not detailed, but .select_related() is trying to do the opposite requesting some extra elements. To make it even clearer (and this is how I found out), here is the Django source code that handles this case:
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))
Source: https://docs.djangoproject.com/en/2.1/_modules/django/db/models/query_utils/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With