Opened 9 years ago

Closed 9 years ago

#25354 closed New feature (fixed)

related_query_name doesn't support class/app_label interpolation

Reported by: James Pulec Owned by: James Pulec
Component: Database layer (models, ORM) Version: 1.8
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Tim Graham)

It currently isn't possible to set related_query_name on a field on an abstract base class using the "%(class)s" or "%(app_label)s" string formatting syntax that is allowed for the related_name parameter of field. This is particularly problematic when trying to define an abstract base class that uses a GenericRelation, since you can't specify a related_name, but can specify a related_query_name. For Example:

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.db import models


class Child(models.Model):
    object_id = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType)
    content_object = GenericForeignKey()


class GenericMixin(models.Model):
    relation = GenericRelation(Child, related_query_name='%(class)s')

    class Meta:
        abstract = True


class Parent(GenericMixin):
    name = models.CharField(max_length=100)


>>> from app.models import Child
>>> Child.objects.filter(parents__name='foo')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/tim/code/django/django/db/models/manager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/tim/code/django/django/db/models/query.py", line 788, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/home/tim/code/django/django/db/models/query.py", line 806, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/home/tim/code/django/django/db/models/sql/query.py", line 1240, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/home/tim/code/django/django/db/models/sql/query.py", line 1266, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/home/tim/code/django/django/db/models/sql/query.py", line 1149, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "/home/tim/code/django/django/db/models/sql/query.py", line 1035, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "/home/tim/code/django/django/db/models/sql/query.py", line 1327, in names_to_path
    "Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'parents' into field. Choices are: %(class)s, content_object, content_type, content_type_id, id, object_id

Change History (9)

comment:1 by Tim Graham, 9 years ago

Description: modified (diff)
Summary: Can't use related_query_name on an abstract base classrelated_query_name doesn't support class/app_label interpolation
Triage Stage: UnreviewedAccepted

Here's the implementation for related_name. I haven't investigated, but it seems it may be reasonable to add this.

comment:2 by James Pulec, 9 years ago

I'd be happy to take a crack at it, but I've never contributed before, and am not the most familiar with the 'related' internals of django. Is this something that should get brought up on django-developers, or would starting to work on a patch be the right approach?

comment:3 by Simon Charette, 9 years ago

@jpulec, I don't think this needs to be brought up on django-developers. You can go ahead and work on a patch and publish it as PR on Github. See our contributing guidelines.

From what I can see of the actual implementation of related_name linked above by Tim a simple similar if self.remove_field.related_query_name block should do. Feel free to hop on #django-dev and ping charettes if you need further help.

comment:4 by James Pulec, 9 years ago

Owner: changed from nobody to James Pulec
Status: newassigned

comment:5 by James Pulec, 9 years ago

comment:6 by Tim Graham, 9 years ago

Has patch: set

Please don't forget to check "Has patch" so the ticket appears in the review queue.

comment:7 by Tim Graham, 9 years ago

Patch needs improvement: set

Left some comments for improvement on the pull request. Please uncheck "Patch needs improvement" when you update it.

comment:8 by James Pulec, 9 years ago

Patch needs improvement: unset

comment:9 by Tim Graham <timograham@…>, 9 years ago

Resolution: fixed
Status: assignedclosed

In f05722a0:

Fixed #25354 -- Added class/app_label interpolation for related_query_name.

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