Opened 8 years ago

Closed 8 years ago

Last modified 8 years ago

#26393 closed Uncategorized (wontfix)

Unable to filter against annotations in Manager with use_for_related_fields

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 (last modified by Tim Graham)

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 = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    objects = PersonManager()


class Article(models.Model):
    published = models.DateTimeField()
    author = models.ForeignKey(Person, 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 (3)

comment:1 by Ryan P Kilby, 8 years ago

Cc: rpkilby@… added

comment:2 by Tim Graham, 8 years ago

Description: modified (diff)
Resolution: wontfix
Status: newclosed
Summary: Unable to filter annotations across relationships.Unable to filter against annotations in Manager with use_for_related_fields

I think you have a misunderstanding of how use_for_related_fields works. The queryset in the custom manager isn't used in a query like Article.objects.filter(...) is it? If I'm missing something obvious and you have a patch demonstrating how your proposal works, then please reopen the ticket with details.

comment:3 by Ryan P Kilby, 8 years ago

Yep - I completely misunderstood how that worked. I assumed that when filtering across relationships, the sql from the related manager was somehow used by the primary model's manager.

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