﻿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
24807	Prefetch_related broken when two models have an M2M to the same model with related_name='+'	Baptiste Mispelon	nobody	"Consider the following models:
{{{#!python
from django.db import models

class Foo(models.Model):
    pass


class Bar(models.Model):
    bar_foos = models.ManyToManyField(Foo, related_name='+')


class Baz(models.Model):
    baz_foos = models.ManyToManyField(Foo, related_name='+')
}}}

Doing `Bar.objects.prefetch_related('+')` raises the following error:
{{{#!python
[...]
  File ""./django/django/db/models/query.py"", line 162, in __iter__
    self._fetch_all()
  File ""./django/django/db/models/query.py"", line 967, in _fetch_all
    self._prefetch_related_objects()
  File ""./django/django/db/models/query.py"", line 591, in _prefetch_related_objects
    prefetch_related_objects(self._result_cache, self._prefetch_related_lookups)
  File ""./django/django/db/models/query.py"", line 1516, in prefetch_related_objects
    obj_list, additional_lookups = prefetch_one_level(obj_list, prefetcher, lookup, level)
  File ""./django/django/db/models/query.py"", line 1615, in prefetch_one_level
    prefetcher.get_prefetch_queryset(instances, lookup.get_current_queryset(level)))
  File ""./django/django/db/models/fields/related.py"", line 935, in get_prefetch_queryset
    queryset = queryset._next_is_sticky().filter(**query)
  File ""./django/django/db/models/query.py"", line 679, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File ""./django/django/db/models/query.py"", line 697, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File ""./django/django/db/models/sql/query.py"", line 1304, in add_q
    clause, require_inner = self._add_q(where_part, self.used_aliases)
  File ""./django/django/db/models/sql/query.py"", line 1331, in _add_q
    current_negated=current_negated, connector=connector, allow_joins=allow_joins)
  File ""./django/django/db/models/sql/query.py"", line 1173, in build_filter
    self.check_related_objects(field, value, opts)
  File ""./django/django/db/models/sql/query.py"", line 1071, in check_related_objects
    self.check_query_object_type(v, opts)
  File ""./django/django/db/models/sql/query.py"", line 1052, in check_query_object_type
    (value, opts.object_name))
ValueError: Cannot query ""Bar object"": Must be ""Baz"" instance.
}}}

Using two different `related_name` (like `'1+'` and `'2+'` for example) makes everything work again.

See attached reproduction testcase."	Bug	closed	Database layer (models, ORM)	1.8	Normal	duplicate			Unreviewed	0	0	0	0	0	0
