Opened 10 years ago
Closed 8 years ago
#26257 closed New feature (fixed)
Add support for expressions like (Lower('myfield'),) in model Meta.ordering
| Reported by: | Mikhail Mezyakov | Owned by: | nobody |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 1.8 |
| Severity: | Normal | Keywords: | meta, ordering, lower |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | yes | Needs documentation: | yes |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Example model:
from django.db import models
from django.db.models.functions import Lower
class BaseModel(models.Model)
name = models.CharField(max_length=255)
value = models.CharField(max_length=100)
class Meta:
ordering = (Lower('value'),)
With this model manage.py test command is running OK, but Django produces this trace when running manage.py runserver:
Performing system checks...
Unhandled exception in thread started by <function wrapper at 0x7f9d9a339488>
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 229, in wrapper
fn(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 114, in inner_run
self.validate(display_num_errors=True)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 469, in validate
return self.check(app_configs=app_configs, display_num_errors=display_num_errors)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 482, in check
include_deployment_checks=include_deployment_checks,
File "/usr/local/lib/python2.7/dist-packages/django/core/checks/registry.py", line 72, in run_checks
new_errors = check(app_configs=app_configs)
File "/usr/local/lib/python2.7/dist-packages/django/core/checks/model_checks.py", line 28, in check_all_models
errors.extend(model.check(**kwargs))
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1216, in check
errors.extend(cls._check_ordering())
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1571, in _check_ordering
fields = {f for f in fields if f != 'pk'}
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1571, in <setcomp>
fields = {f for f in fields if f != 'pk'}
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1567, in <genexpr>
fields = (f for f in fields if '__' not in f)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1562, in <genexpr>
fields = (f for f in fields if
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 1560, in <genexpr>
fields = ((f[1:] if f.startswith('-') else f) for f in fields)
AttributeError: 'Lower' object has no attribute 'startswith'
Change History (4)
comment:1 by , 10 years ago
| Component: | Core (System checks) → Database layer (models, ORM) |
|---|---|
| Summary: | runserver fails with AttributeError when using Meta.ordering = (Lower('myfield'),) → Add support for expressions like (Lower('myfield'),) in model Meta.ordering |
| Triage Stage: | Unreviewed → Accepted |
| Type: | Bug → New feature |
comment:2 by , 9 years ago
This is related to #24747 because the requested feature could be expressed as ordering = ['name__lower'] if support for transforms in order_by() lands.
It's worth keeping this ticket open because the ordering checks will need to be adjusted to allow reference to transforms.
comment:4 by , 8 years ago
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
In 093fd479d6be1790c6dc174f9df3a895b50e8a2f:
Fixed #28335 -- Allowed query expressions in Meta.ordering.
I don't think there's any documentation or tests in Django's test suite to suggest that expressions are supported in
Meta.ordering, but we could investigate to see if adding that is feasible.