#25354: related_query_name doesn't support class/app_label interpolation -------------------------------------+------------------------------------- Reporter: jpulec | Owner: nobody Type: New feature | Status: new Component: Database layer | Version: 1.8 (models, ORM) | Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- Changes (by timgraham):
* needs_better_patch: => 0 * needs_tests: => 0 * needs_docs: => 0 * stage: Unreviewed => Accepted Old description: > 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: > {{{ > #!div style="font-size: 80%" > Code highlighting: > {{{#!python > > class Child(models.Model): > object_id = PositiveIntegerField() > content_type = ForeignKey(ContentType) > content_object = GenericForeignKey() > > class GenericMixin(models.Model): > relation = GenrericRelation(Child, related_query_name='%(class)s') > > class Meta: > abstract = True > > class Parent(GenericMixin): > name = CharField() > > instance = Child.objects.filter(parents__name) # This query will not > work, as 'parents' is not set as the related_query_name for the Parent > Model > }}} > }}} New description: 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: {{{#!python 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 }}} -- Comment: Here's the [https://github.com/django/django/blob/1bbca7961cee20c4ddd453a7d74d316e84f4bbb5/django/db/models/fields/related.py#L295-L298 implementation for related_name]. I haven't investigated, but it seems it may be reasonable to add this. -- Ticket URL: <https://code.djangoproject.com/ticket/25354#comment:1> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/064.d9c224992093352fc73301776ae5c4c2%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.