Created
January 28, 2026 16:53
-
-
Save mweinelt/bce7efabb0520b38820f49b80348a172 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| _____________________________________________________________________________ test_polymorphic_paginated_query ______________________________________________________________________________ | |
| [gw4] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_paginated_query(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| query = """\ | |
| query { | |
| projectsPaginated { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| """ | |
| # ContentType, base table, two subtables = 4 queries | |
| > with assert_num_queries(4): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:283: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 4 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 2 queries executed, 4 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."topic" FROM "polymorphism_project" ORDER BY "polymorphism_project"."id" ASC | |
| E 2. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projectsPaginated { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projectsPaginated { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| __________________________________________________________________________ test_polymorphic_offset_paginated_query __________________________________________________________________________ | |
| [gw4] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_offset_paginated_query(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| query = """\ | |
| query { | |
| projectsOffsetPaginated { | |
| totalCount | |
| results { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| } | |
| """ | |
| # ContentType, base table, two subtables = 4 queries + 1 query for total count | |
| > with assert_num_queries(5): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:322: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 5 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 3 queries executed, 5 expected | |
| E Captured queries were: | |
| E 1. SELECT COUNT(*) AS "__count" FROM "polymorphism_project" | |
| E 2. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."topic" FROM "polymorphism_project" ORDER BY "polymorphism_project"."id" ASC LIMIT 100 | |
| E 3. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:4:9 | |
| 3 | totalCount | |
| 4 | results { | |
| | ^ | |
| 5 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/types/field.py", line 232, in get_result | |
| return self.base_resolver(*args, **kwargs) | |
| ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__ | |
| return self.wrapped_func(*args, **kwargs) | |
| ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 96, in sync_resolver | |
| retval = qs_hook(retval) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:4:9 | |
| 3 | totalCount | |
| 4 | results { | |
| | ^ | |
| 5 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/types/field.py", line 232, in get_result | |
| return self.base_resolver(*args, **kwargs) | |
| ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/types/fields/resolver.py", line 250, in __call__ | |
| return self.wrapped_func(*args, **kwargs) | |
| ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 96, in sync_resolver | |
| retval = qs_hook(retval) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| _________________________________________________________________________________ test_polymorphic_relation _________________________________________________________________________________ | |
| [gw4] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_relation(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| art_company = Company.objects.create(name="ArtCompany", main_project=ap) | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| research_company = Company.objects.create(name="ResearchCompany", main_project=rp) | |
| query = """\ | |
| query { | |
| companies { | |
| name | |
| mainProject { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| } | |
| """ | |
| # Company, ContentType, base table, two subtables = 5 queries | |
| > with assert_num_queries(5): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:371: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 5 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 3 queries executed, 5 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_company"."id", "polymorphism_company"."name", "polymorphism_company"."main_project_id" FROM "polymorphism_company" ORDER BY "polymorphism_company"."name" ASC | |
| E 2. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."company_id", "polymorphism_project"."topic" FROM "polymorphism_project" WHERE ("polymorphism_project"."id") IN ((5), (6)) | |
| E 3. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | companies { | |
| | ^ | |
| 3 | name | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2002, in _fetch_all | |
| self._prefetch_related_objects() | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1369, in _prefetch_related_objects | |
| prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2451, in prefetch_related_objects | |
| obj_list, additional_lookups = prefetch_one_level( | |
| ~~~~~~~~~~~~~~~~~~^ | |
| obj_to_fetch, | |
| ^^^^^^^^^^^^^ | |
| ...<2 lines>... | |
| level, | |
| ^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2626, in prefetch_one_level | |
| all_related_objects = list(rel_qs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | companies { | |
| | ^ | |
| 3 | name | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2002, in _fetch_all | |
| self._prefetch_related_objects() | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1369, in _prefetch_related_objects | |
| prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2451, in prefetch_related_objects | |
| obj_list, additional_lookups = prefetch_one_level( | |
| ~~~~~~~~~~~~~~~~~~^ | |
| obj_to_fetch, | |
| ^^^^^^^^^^^^^ | |
| ...<2 lines>... | |
| level, | |
| ^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2626, in prefetch_one_level | |
| all_related_objects = list(rel_qs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| _______________________________________________________________________________ test_polymorphic_nested_list ________________________________________________________________________________ | |
| [gw4] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_nested_list(): | |
| company = Company.objects.create(name="Company") | |
| ap = ArtProject.objects.create(company=company, topic="Art", artist="Artist") | |
| rp = ResearchProject.objects.create( | |
| company=company, topic="Research", supervisor="Supervisor" | |
| ) | |
| query = """\ | |
| query { | |
| companies { | |
| name | |
| projects { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| } | |
| """ | |
| # Company, ContentType, base table, two subtables = 5 queries | |
| > with assert_num_queries(5): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:423: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 5 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 3 queries executed, 5 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_company"."id", "polymorphism_company"."name" FROM "polymorphism_company" ORDER BY "polymorphism_company"."name" ASC | |
| E 2. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."company_id", "polymorphism_project"."topic" FROM "polymorphism_project" WHERE "polymorphism_project"."company_id" IN (3) ORDER BY "polymorphism_project"."id" ASC | |
| E 3. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | companies { | |
| | ^ | |
| 3 | name | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2002, in _fetch_all | |
| self._prefetch_related_objects() | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1369, in _prefetch_related_objects | |
| prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2451, in prefetch_related_objects | |
| obj_list, additional_lookups = prefetch_one_level( | |
| ~~~~~~~~~~~~~~~~~~^ | |
| obj_to_fetch, | |
| ^^^^^^^^^^^^^ | |
| ...<2 lines>... | |
| level, | |
| ^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2607, in prefetch_one_level | |
| ) = prefetcher.get_prefetch_querysets( | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ | |
| instances, lookup.get_current_querysets(level) | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/fields/related_descriptors.py", line 777, in get_prefetch_querysets | |
| for rel_obj in queryset: | |
| ^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | companies { | |
| | ^ | |
| 3 | name | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2002, in _fetch_all | |
| self._prefetch_related_objects() | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1369, in _prefetch_related_objects | |
| prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2451, in prefetch_related_objects | |
| obj_list, additional_lookups = prefetch_one_level( | |
| ~~~~~~~~~~~~~~~~~~^ | |
| obj_to_fetch, | |
| ^^^^^^^^^^^^^ | |
| ...<2 lines>... | |
| level, | |
| ^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2607, in prefetch_one_level | |
| ) = prefetcher.get_prefetch_querysets( | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ | |
| instances, lookup.get_current_querysets(level) | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/fields/related_descriptors.py", line 777, in get_prefetch_querysets | |
| for rel_obj in queryset: | |
| ^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| _____________________________________________________________________________ test_optimizer_hints_polymorphic ______________________________________________________________________________ | |
| [gw4] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_optimizer_hints_polymorphic(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist", art_style="abstract") | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| query = """\ | |
| query { | |
| projects { | |
| __typename | |
| topicUpper | |
| ... on ArtProjectType { | |
| artistUpper | |
| artStyleUpper | |
| } | |
| } | |
| } | |
| """ | |
| # ContentType, base table, two subtables = 4 queries | |
| > with assert_num_queries(4): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:466: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 4 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 2 queries executed, 4 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."topic" FROM "polymorphism_project" ORDER BY "polymorphism_project"."id" ASC | |
| E 2. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| _____________________________________________________________________________ test_polymorphic_interface_query ______________________________________________________________________________ | |
| [gw1] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_interface_query(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| query = """\ | |
| query { | |
| projects { | |
| edges { | |
| node { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| } | |
| } | |
| """ | |
| # ContentType, base table, two subtables = 4 queries | |
| > with assert_num_queries(4): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/node_polymorphism/test_optimizer.py:34: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 4 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 2 queries executed, 4 expected | |
| E Captured queries were: | |
| E 1. SELECT "tests_project"."id", "tests_project"."polymorphic_ctype_id", "tests_project"."topic" FROM "tests_project" ORDER BY "tests_project"."id" ASC LIMIT 101 | |
| E 2. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'tests' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR tests.ArtProject is not derived from tests.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | edges { | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 500, in resolve | |
| return self.connection_type.resolve_connection( | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ | |
| nodes, | |
| ^^^^^^ | |
| ...<6 lines>... | |
| **kwargs, | |
| ^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/relay/types.py", line 915, in resolve_connection | |
| for i, v in enumerate(iterator) | |
| ~~~~~~~~~^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: tests.ArtProject is not derived from tests.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 tests.ArtProject is not derived from tests.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | edges { | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 500, in resolve | |
| return self.connection_type.resolve_connection( | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ | |
| nodes, | |
| ^^^^^^ | |
| ...<6 lines>... | |
| **kwargs, | |
| ^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/relay/types.py", line 915, in resolve_connection | |
| for i, v in enumerate(iterator) | |
| ~~~~~~~~~^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: tests.ArtProject is not derived from tests.ResearchProject | |
| _____________________________________________________________________________ test_polymorphic_interface_query ______________________________________________________________________________ | |
| [gw1] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_interface_query(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| query = """\ | |
| query { | |
| projects { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| """ | |
| # ContentType, base table, two subtables = 4 queries | |
| > with assert_num_queries(4): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:40: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 4 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 2 queries executed, 4 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."topic" FROM "polymorphism_project" ORDER BY "polymorphism_project"."id" ASC | |
| E 2. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ___________________________________________________________________________ test_polymorphic_query_abstract_model ___________________________________________________________________________ | |
| [gw1] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_query_abstract_model(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| sp = SoftwareProject.objects.create( | |
| topic="Software", repository="https://example.com", timeline="3 months" | |
| ) | |
| ep = EngineeringProject.objects.create( | |
| topic="Engineering", lead_engineer="Elara Voss", timeline="6 years" | |
| ) | |
| query = """\ | |
| query { | |
| projects { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ...on TechnicalProjectType { | |
| timeline | |
| } | |
| ... on SoftwareProjectType { | |
| repository | |
| } | |
| ...on EngineeringProjectType { | |
| leadEngineer | |
| } | |
| } | |
| } | |
| """ | |
| > with assert_num_queries(5): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:86: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 5 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 2 queries executed, 5 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."topic" FROM "polymorphism_project" ORDER BY "polymorphism_project"."id" ASC | |
| E 2. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| ____________________________________________________________________ test_polymorphic_query_multiple_inheritance_levels _____________________________________________________________________ | |
| [gw1] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_query_multiple_inheritance_levels(): | |
| app1 = AndroidProject.objects.create( | |
| topic="Software", | |
| repository="https://example.com/android", | |
| timeline="3 months", | |
| android_version="14", | |
| ) | |
| app2 = IOSProject.objects.create( | |
| topic="Software", | |
| repository="https://example.com/ios", | |
| timeline="5 months", | |
| ios_version="16", | |
| ) | |
| ep = EngineeringProject.objects.create( | |
| topic="Engineering", lead_engineer="Elara Voss", timeline="6 years" | |
| ) | |
| query = """\ | |
| query { | |
| projects { | |
| __typename | |
| topic | |
| ...on TechnicalProjectType { | |
| timeline | |
| } | |
| ...on AppProjectType { | |
| repository | |
| } | |
| ...on AndroidProjectType { | |
| androidVersion | |
| } | |
| ...on IOSProjectType { | |
| iosVersion | |
| } | |
| ...on EngineeringProjectType { | |
| leadEngineer | |
| } | |
| } | |
| } | |
| """ | |
| # Project Table, Content Type, AndroidProject, IOSProject, EngineeringProject = 5 | |
| > with assert_num_queries(5): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:151: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 5 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 2 queries executed, 5 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."topic" FROM "polymorphism_project" ORDER BY "polymorphism_project"."id" ASC | |
| E 2. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.EngineeringProject is not derived from polymorphism.IOSProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.EngineeringProject is not derived from polymorphism.IOSProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.EngineeringProject is not derived from polymorphism.IOSProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.EngineeringProject is not derived from polymorphism.IOSProject | |
| ______________________________________________________________________ test_polymorphic_query_abstract_model_on_field _______________________________________________________________________ | |
| [gw1] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_query_abstract_model_on_field(): | |
| ep = EngineeringProject.objects.create( | |
| topic="Engineering", lead_engineer="Elara Voss", timeline="6 years" | |
| ) | |
| company = Company.objects.create(name="Company", main_project=ep) | |
| query = """\ | |
| query { | |
| companies { | |
| name | |
| mainProject { | |
| __typename | |
| topic | |
| ...on TechnicalProjectType { | |
| timeline | |
| } | |
| ...on EngineeringProjectType { | |
| leadEngineer | |
| } | |
| } | |
| } | |
| } | |
| """ | |
| > with assert_num_queries(4): | |
| ^^^^^^^^^^^^^^^^^^^^^ | |
| tests/polymorphism/test_optimizer.py:205: | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| /etc/profiles/per-user/hexa/lib/python3.13/contextlib.py:148: in __exit__ | |
| next(self.gen) | |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | |
| n = 4 | |
| @contextlib.contextmanager | |
| def assert_num_queries(n: int, *, using=DEFAULT_DB_ALIAS): | |
| is_async = (gql_client := _client.get(None)) is not None and gql_client.is_async | |
| if is_async: | |
| ctx_manager = AsyncCaptureQueriesContext(using) | |
| else: | |
| ctx_manager = CaptureQueriesContext(connection=connections[using]) | |
| with ctx_manager as ctx: | |
| yield ctx | |
| executed = len(ctx) | |
| > assert executed == n, ( | |
| ^^^^^^^^^^^^^ | |
| "{} queries executed, {} expected\nCaptured queries were:\n{}".format( | |
| executed, | |
| n, | |
| "\n".join( | |
| f"{i}. {q['sql']}" for i, q in enumerate(ctx.captured_queries, start=1) | |
| ), | |
| ) | |
| ) | |
| E AssertionError: 3 queries executed, 4 expected | |
| E Captured queries were: | |
| E 1. SELECT "polymorphism_company"."id", "polymorphism_company"."name", "polymorphism_company"."main_project_id" FROM "polymorphism_company" ORDER BY "polymorphism_company"."name" ASC | |
| E 2. SELECT "polymorphism_project"."id", "polymorphism_project"."polymorphic_ctype_id", "polymorphism_project"."company_id", "polymorphism_project"."topic" FROM "polymorphism_project" WHERE ("polymorphism_project"."id") IN ((9)) | |
| E 3. SELECT "django_content_type"."id", "django_content_type"."app_label", "django_content_type"."model" FROM "django_content_type" WHERE ("django_content_type"."app_label" = 'polymorphism' AND "django_content_type"."model" = 'project') LIMIT 21 | |
| tests/utils.py:128: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | companies { | |
| | ^ | |
| 3 | name | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2002, in _fetch_all | |
| self._prefetch_related_objects() | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1369, in _prefetch_related_objects | |
| prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2451, in prefetch_related_objects | |
| obj_list, additional_lookups = prefetch_one_level( | |
| ~~~~~~~~~~~~~~~~~~^ | |
| obj_to_fetch, | |
| ^^^^^^^^^^^^^ | |
| ...<2 lines>... | |
| level, | |
| ^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2626, in prefetch_one_level | |
| all_related_objects = list(rel_qs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | companies { | |
| | ^ | |
| 3 | name | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2002, in _fetch_all | |
| self._prefetch_related_objects() | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 1369, in _prefetch_related_objects | |
| prefetch_related_objects(self._result_cache, *self._prefetch_related_lookups) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2451, in prefetch_related_objects | |
| obj_list, additional_lookups = prefetch_one_level( | |
| ~~~~~~~~~~~~~~~~~~^ | |
| obj_to_fetch, | |
| ^^^^^^^^^^^^^ | |
| ...<2 lines>... | |
| level, | |
| ^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2626, in prefetch_one_level | |
| all_related_objects = list(rel_qs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 390, in __iter__ | |
| self._fetch_all() | |
| ~~~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.EngineeringProject | |
| ________________________________________________________________________ test_polymorphic_query_optimization_working ________________________________________________________________________ | |
| [gw1] linux -- Python 3.13.11 /tmp/strawberry-django/.venv/bin/python3 | |
| @pytest.mark.django_db(transaction=True) | |
| def test_polymorphic_query_optimization_working(): | |
| ap = ArtProject.objects.create(topic="Art", artist="Artist") | |
| rp = ResearchProject.objects.create(topic="Research", supervisor="Supervisor") | |
| query = """\ | |
| query { | |
| projects { | |
| __typename | |
| topic | |
| ... on ArtProjectType { | |
| artist | |
| } | |
| ... on ResearchProjectType { | |
| supervisor | |
| } | |
| } | |
| } | |
| """ | |
| with CaptureQueriesContext(connection=connections[DEFAULT_DB_ALIAS]) as ctx: | |
| result = schema.execute_sync(query) | |
| # validate that we're not selecting extra fields | |
| > assert any("artist" in q["sql"] for q in ctx.captured_queries) | |
| E assert False | |
| E + where False = any(<generator object test_polymorphic_query_optimization_working.<locals>.<genexpr> at 0x7ff6e528f100>) | |
| tests/polymorphism/test_optimizer.py:246: AssertionError | |
| ----------------------------------------------------------------------------------- Captured stderr call ------------------------------------------------------------------------------------ | |
| ERROR polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| ------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------- | |
| ERROR strawberry.execution:logging.py:25 polymorphism.IOSProject is not derived from polymorphism.ResearchProject | |
| GraphQL request:2:7 | |
| 1 | query { | |
| 2 | projects { | |
| | ^ | |
| 3 | __typename | |
| Traceback (most recent call last): | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/graphql/execution/execute.py", line 523, in execute_field | |
| result = resolve_fn(source, info, **args) | |
| File "/tmp/strawberry-django/strawberry_django/optimizer.py", line 1693, in resolve | |
| ret = next_(root, info, *args, **kwargs) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 778, in _resolver | |
| return _get_result_with_extensions( | |
| _source, | |
| strawberry_info, | |
| **kwargs, | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 765, in extension_resolver | |
| return reduce( | |
| ~~~~~~~ | |
| ...<2 lines>... | |
| wrapped_get_result, | |
| ~~~~~~~~~~~~~~~~~~~ | |
| )(_source, info, **field_kwargs) | |
| ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 760, in wrapped_get_result | |
| return _get_result( | |
| _source, info, field_args=field_args, field_kwargs=kwargs | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/strawberry/schema/schema_converter.py", line 717, in _get_result | |
| return field.get_result( | |
| ~~~~~~~~~~~~~~~~^ | |
| _source, info=info, args=field_args, kwargs=field_kwargs | |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| ) | |
| ^ | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 289, in get_result | |
| result = django_resolver( | |
| self.get_queryset_hook(**kwargs), | |
| qs_hook=lambda qs: qs, | |
| )(result) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 120, in inner_wrapper | |
| return f(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 87, in sync_resolver | |
| retval = resolver(*args, **kwargs) | |
| File "/tmp/strawberry-django/strawberry_django/fields/field.py", line 307, in qs_hook | |
| qs = default_qs_hook(qs) | |
| File "/tmp/strawberry-django/strawberry_django/resolvers.py", line 44, in default_qs_hook | |
| qs._fetch_all() # type: ignore | |
| ~~~~~~~~~~~~~^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/django/db/models/query.py", line 2000, in _fetch_all | |
| self._result_cache = list(self._iterable_class(self)) | |
| ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 91, in _polymorphic_iterator | |
| yield from self.queryset._get_real_instances(base_result_objects) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^ | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query.py", line 467, in _get_real_instances | |
| translated_field_name = translate_polymorphic_field_path( | |
| real_concrete_class, field | |
| ) | |
| File "/tmp/strawberry-django/.venv/lib/python3.13/site-packages/polymorphic/query_translate.py", line 159, in translate_polymorphic_field_path | |
| raise FieldError( | |
| f"{model._meta.label} is not derived from {queryset_model._meta.label}" | |
| ) | |
| django.core.exceptions.FieldError: polymorphism.IOSProject is not derived from polymorphism.ResearchProject |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment