﻿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
