#32775: LiveServerTestCase fails when query expressions are used for model
ordering
---------------------------------------------+------------------------
Reporter: Gergely Kalmár | Owner: nobody
Type: Bug | Status: new
Component: Testing framework | Version: 3.2
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
---------------------------------------------+------------------------
= Reproducing the bug =
Create a `models.py` file as follows:
{{{
#!python
from django.db import models
from django.db.models.functions import Lower
class Order(models.Model):
id = models.CharField(max_length=10, primary_key=True)
class Meta:
ordering = [Lower('id')]
class Offer(models.Model):
order = models.OneToOneField(Order, primary_key=True,
on_delete=models.PROTECT)
}}}
Create a test case:
{{{
#!python
from django.contrib.staticfiles.testing import LiveServerTestCase
class Test(LiveServerTestCase):
def test_case(self):
pass
}}}
Run the tests with `./manage.py test`:
{{{
> ./manage.py test
Creating test database for alias 'default'...
Traceback (most recent call last):
File "./manage.py", line 17, in <module>
main()
File "./manage.py", line 13, in main
execute_from_command_line(sys.argv)
File ".../lib/python3.8/site-
packages/django/core/management/__init__.py", line 419, in
execute_from_command_line
utility.execute()
File ".../lib/python3.8/site-
packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File ".../lib/python3.8/site-
packages/django/core/management/commands/test.py", line 23, in
run_from_argv
super().run_from_argv(argv)
File ".../lib/python3.8/site-packages/django/core/management/base.py",
line 354, in run_from_argv
self.execute(*args, **cmd_options)
File ".../lib/python3.8/site-packages/django/core/management/base.py",
line 398, in execute
output = self.handle(*args, **options)
File ".../lib/python3.8/site-
packages/django/core/management/commands/test.py", line 55, in handle
failures = test_runner.run_tests(test_labels)
File ".../lib/python3.8/site-packages/django/test/runner.py", line 725,
in run_tests
old_config = self.setup_databases(aliases=databases)
File ".../lib/python3.8/site-packages/django/test/runner.py", line 643,
in setup_databases
return _setup_databases(
File ".../lib/python3.8/site-packages/django/test/utils.py", line 179,
in setup_databases
connection.creation.create_test_db(
File ".../lib/python3.8/site-
packages/django/db/backends/base/creation.py", line 90, in create_test_db
self.connection._test_serialized_contents =
self.serialize_db_to_string()
File ".../lib/python3.8/site-
packages/django/db/backends/base/creation.py", line 136, in
serialize_db_to_string
serializers.serialize("json", get_objects(), indent=None, stream=out)
File ".../lib/python3.8/site-
packages/django/core/serializers/__init__.py", line 129, in serialize
s.serialize(queryset, **options)
File ".../lib/python3.8/site-packages/django/core/serializers/base.py",
line 90, in serialize
for count, obj in enumerate(queryset, start=1):
File ".../lib/python3.8/site-
packages/django/db/backends/base/creation.py", line 133, in get_objects
yield from queryset.iterator()
File ".../lib/python3.8/site-packages/django/db/models/query.py", line
353, in _iterator
yield from self._iterable_class(self, chunked_fetch=use_chunked_fetch,
chunk_size=chunk_size)
File ".../lib/python3.8/site-packages/django/db/models/query.py", line
51, in __iter__
results = compiler.execute_sql(chunked_fetch=self.chunked_fetch,
chunk_size=self.chunk_size)
File ".../lib/python3.8/site-packages/django/db/models/sql/compiler.py",
line 1162, in execute_sql
sql, params = self.as_sql()
File ".../lib/python3.8/site-packages/django/db/models/sql/compiler.py",
line 513, in as_sql
extra_select, order_by, group_by = self.pre_sql_setup()
File ".../lib/python3.8/site-packages/django/db/models/sql/compiler.py",
line 56, in pre_sql_setup
order_by = self.get_order_by()
File ".../lib/python3.8/site-packages/django/db/models/sql/compiler.py",
line 372, in get_order_by
resolved = expr.resolve_expression(self.query, allow_joins=True,
reuse=None)
File ".../lib/python3.8/site-packages/django/db/models/expressions.py",
line 247, in resolve_expression
c.set_source_expressions([
File ".../lib/python3.8/site-packages/django/db/models/expressions.py",
line 248, in <listcomp>
expr.resolve_expression(query, allow_joins, reuse, summarize)
File ".../lib/python3.8/site-packages/django/db/models/expressions.py",
line 678, in resolve_expression
c.source_expressions[pos] = arg.resolve_expression(query, allow_joins,
reuse, summarize, for_save)
File ".../lib/python3.8/site-packages/django/db/models/expressions.py",
line 578, in resolve_expression
return query.resolve_ref(self.name, allow_joins, reuse, summarize)
File ".../lib/python3.8/site-packages/django/db/models/sql/query.py",
line 1754, in resolve_ref
join_info = self.setup_joins(field_list, self.get_meta(),
self.get_initial_alias(), can_reuse=reuse)
File ".../lib/python3.8/site-packages/django/db/models/sql/query.py",
line 1623, in setup_joins
path, final_field, targets, rest = self.names_to_path(
File ".../lib/python3.8/site-packages/django/db/models/sql/query.py",
line 1537, in names_to_path
raise FieldError("Cannot resolve keyword '%s' into field. "
django.core.exceptions.FieldError: Cannot resolve keyword 'id' into field.
Choices are: order, order_id
}}}
If there is any workaround that I can use in the meantime please let me
know. Thank you!
--
Ticket URL: <https://code.djangoproject.com/ticket/32775>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/056.83e93ed007ea63d8b287fcdd9774de5f%40djangoproject.com.