Opened 9 years ago

Last modified 9 years ago

#24986 closed Bug

Selecting distinct on lower() function throws AttributeError("'Func' object has no attribute 'column'") — at Version 2

Reported by: Wojciech Bartosiak Owned by: nobody
Component: Database layer (models, ORM) Version: dev
Severity: Normal Keywords: F(), ORM, distinct
Cc: josh.smeaton@… Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Wojciech Bartosiak)

I have simple table:

class Author(models.Model):
    name = models.CharField(max_length=40)

I want to write Query using Django ORM to be similar to:

SELECT DISTINCT LOWER(name) from my_app_author;

I finally ended with:

Author.objects.annotate(
    name_lower=Func(F('name'), function='lower')
).distinct('name_lower')

But I'm receiving error:

Traceback (most recent call last):
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/query.py", line 138, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/query.py", line 162, in __iter__
    self._fetch_all()
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/query.py", line 965, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/query.py", line 238, in iterator
    results = compiler.execute_sql()
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 829, in execute_sql
    sql, params = self.as_sql()
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 381, in as_sql
    distinct_fields = self.get_distinct()
  File "/opt/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 545, in get_distinct
    result.append("%s.%s" % (qn(alias), qn2(target.column)))
AttributeError: 'Func' object has no attribute 'column'

but when i write:

Author.objects.annotate(
    name_lower=Func(F('name'), function='lower')
).distinct('something')

I'm receiving an error:

django.core.exceptions.FieldError: 
Cannot resolve keyword 'something' into field. 
Choices are: id, name, name_lower, src_id

As database driver I'm using 'ENGINE': 'django.contrib.gis.db.backends.postgis'

Change History (2)

comment:1 by Wojciech Bartosiak, 9 years ago

comment:2 by Wojciech Bartosiak, 9 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top