strawberry-graphql / strawberry-django

Strawberry GraphQL Django extension
https://strawberry.rocks/docs/django
MIT License
404 stars 117 forks source link

Optional field based on reverse Django relation is not working #292

Closed erwinfeser closed 1 year ago

erwinfeser commented 1 year ago

Optional field based on reverse Django relation is not working

# models.py
class Car(models.Model):
    something = models.OneToOneField("Something", related_name="car", null=True, blank=True)

class Something(models.Model):
    is_active = models.BooleanField(default=False)

# strawberry_types.py
@strawberry.django.type(Car)
class Car:
    something: Optional["Something"]

@strawberry.django.type(Something)
class Something:
    car: Optional["Car"]

It works for Car type but it fails for Something type, it can not resolve car based on the related_name definition

System Information

Additional Context

image

Upvote & Fund

Fund with Polar

bellini666 commented 1 year ago

Hi @erwinfeser ,

Strange that the KeyError you are seeing is actually expected if the value is not already cached in the field. But as you can see here, that code is inside a try/except for KeyError. So wondering how KeyError got to a point to show you a traceback

erwinfeser commented 1 year ago

@bellini666 this is the traceback. I hope it helps.

Traceback (most recent call last):
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry_django/fields/field.py", line 174, in get_result
    result = attr.related.get_cached_value(source)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/django/db/models/fields/mixins.py", line 15, in get_cached_value
    return instance._state.fields_cache[cache_name]
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: 'current_dax'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/graphql/execution/execute.py", line 521, in execute_field
    result = resolve_fn(source, info, **args)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry/schema/schema_converter.py", line 660, in _resolver
    return _get_result_with_extensions(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry/schema/schema_converter.py", line 646, in extension_resolver
    return reduce(
           ^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry/schema/schema_converter.py", line 641, in wrapped_get_result
    return _get_result(
           ^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry/schema/schema_converter.py", line 602, in _get_result
    return field.get_result(
           ^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry_django/fields/field.py", line 184, in get_result
    return django_getattr(
           ^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry_django/resolvers.py", line 146, in django_getattr
    return django_resolver(getattr, qs_hook=qs_hook)(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry_django/resolvers.py", line 102, in inner_wrapper
    return f(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/strawberry_django/resolvers.py", line 74, in sync_resolver
    retval = resolver(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/erwin/.pyenv/versions/api/lib/python3.11/site-packages/django/db/models/fields/related_descriptors.py", line 492, in __get__
    raise self.RelatedObjectDoesNotExist(
physical.models.RackSlot.current_dax.RelatedObjectDoesNotExist: RackSlot has no current_dax.