#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.

Reply via email to