Opened 9 years ago

Last modified 9 years ago

#26393 closed Uncategorized

Unable to filter annotations across relationships. — at Initial Version

Reported by: Ryan P Kilby Owned by: nobody
Component: Database layer (models, ORM) Version: 1.9
Severity: Normal Keywords:
Cc: rpkilby@… Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Per the title, it seems like it would make sense to be able to filter annotations across relationships. Given the following,

from django.db import models
from django.db.models import Value as V
from django.db.models.functions import Concat


class PersonManager(models.Manager):
    use_for_related_fields = True

    def get_queryset(self):
        queryset = super(PersonManager, self).get_queryset()
        queryset = queryset.annotate(full_name=Concat(
            'first_name', V(' '), 'last_name',
            output_field=models.CharField()
        ))
        return queryset


class Person(models.Model):
    first_name = SubCharField(max_length=100)
    last_name = SubSubCharField(max_length=100)

    objects = UserManager()


class Article(models.Model):
    published = models.DateTimeField()
    author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)

Running this:

Article.objects.filter(author__full_name="Bob, just Bob")

Produced the following traceback (snipped)

  ...
  File "site-packages/django/db/models/query.py", line 790, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "site-packages/django/db/models/query.py", line 808, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "site-packages/django/db/models/sql/query.py", line 1243, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "site-packages/django/db/models/sql/query.py", line 1269, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "site-packages/django/db/models/sql/query.py", line 1192, in build_filter
    raise FieldError('Related Field got invalid lookup: {}'.format(lookups[0]))
FieldError: Related Field got invalid lookup: full_name

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top