id summary reporter owner description type status component version severity resolution keywords cc stage has_patch needs_docs needs_tests needs_better_patch easy ui_ux 20378 Reverse join fails when GenericRelation is defined on an abstract model gwahl@… Anssi Kääriäinen "When you define a GenericRelation on an abstract model: {{{#!python class HasLinks(models.Model): links = generic.GenericRelation(Link) class Meta: abstract = True class HasLinkThing(HasLinks): pass }}} You should still be able to query using the reverse join: {{{#!python HasLinkThing.objects.filter(links=whatever) }}} But it fails with when trying to calculate the join columns, because it's trying to get the pk of the abstract, instead of concrete, model: {{{ Traceback (most recent call last): File "".tox/py27-dj16/src/django/tests/generic_relations_regress/tests.py"", line 145, in test_abstract_reverse_join self.assertQuerysetEqual(HasLinkThing.objects.filter(links=link), [ File "".tox/py27-dj16/src/django/django/db/models/manager.py"", line 163, in filter return self.get_queryset().filter(*args, **kwargs) File "".tox/py27-dj16/src/django/django/db/models/query.py"", line 661, in filter return self._filter_or_exclude(False, *args, **kwargs) File "".tox/py27-dj16/src/django/django/db/models/query.py"", line 679, in _filter_or_exclude clone.query.add_q(Q(*args, **kwargs)) File "".tox/py27-dj16/src/django/django/db/models/sql/query.py"", line 1200, in add_q clause = self._add_q(where_part, used_aliases) File "".tox/py27-dj16/src/django/django/db/models/sql/query.py"", line 1236, in _add_q current_negated=current_negated) File "".tox/py27-dj16/src/django/django/db/models/sql/query.py"", line 1102, in build_filter allow_explicit_fk=True) File "".tox/py27-dj16/src/django/django/db/models/sql/query.py"", line 1365, in setup_joins connection = alias, opts.db_table, join.join_field.get_joining_columns() File "".tox/py27-dj16/src/django/django/db/models/fields/related.py"", line 862, in get_joining_columns return self.field.get_reverse_joining_columns() File "".tox/py27-dj16/src/django/django/db/models/fields/related.py"", line 1009, in get_reverse_joining_columns return self.get_joining_columns(reverse_join=True) File "".tox/py27-dj16/src/django/django/contrib/contenttypes/generic.py"", line 199, in get_joining_columns return super(GenericRelation, self).get_joining_columns(reverse_join) File "".tox/py27-dj16/src/django/django/db/models/fields/related.py"", line 1005, in get_joining_columns source = self.reverse_related_fields if reverse_join else self.related_fields File "".tox/py27-dj16/src/django/django/db/models/fields/related.py"", line 980, in reverse_related_fields return [(rhs_field, lhs_field) for lhs_field, rhs_field in self.related_fields] File "".tox/py27-dj16/src/django/django/db/models/fields/related.py"", line 975, in related_fields self._related_fields = self.resolve_related_fields() File "".tox/py27-dj16/src/django/django/contrib/contenttypes/generic.py"", line 178, in resolve_related_fields self.to_fields = [self.model._meta.pk.name] AttributeError: 'NoneType' object has no attribute 'name' }}} I've written a failing test to demonstrate: https://github.com/fusionbox/django/commit/03aa282467b. This test passes in django 1.5.1, but fails on master, so I believe this is a regression introduced by #19385." Bug closed contrib.contenttypes dev Release blocker fixed Accepted 0 0 0 0 0 0