#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 [email protected].
To post to this group, send email to [email protected].
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.