mirror of
https://github.com/django/django.git
synced 2025-10-24 22:26:08 +00:00
Fixed #16609 -- Fixed duplicate admin results when searching nested M2M relations.
This was fixed earlier but only when the M2M relation was at the first level on the object. This commit fixes the issue even when the M2M is at deeper levels, such as behind a foreign key.
This commit is contained in:
committed by
Tim Graham
parent
4dcc649341
commit
d084176cc1
@@ -10,6 +10,7 @@ from django.core.urlresolvers import NoReverseMatch, reverse
|
||||
from django.db import models
|
||||
from django.db.models.constants import LOOKUP_SEP
|
||||
from django.db.models.deletion import Collector
|
||||
from django.db.models.sql.constants import QUERY_TERMS
|
||||
from django.forms.forms import pretty_name
|
||||
from django.utils import formats, six, timezone
|
||||
from django.utils.encoding import force_str, force_text, smart_text
|
||||
@@ -22,10 +23,20 @@ def lookup_needs_distinct(opts, lookup_path):
|
||||
"""
|
||||
Returns True if 'distinct()' should be used to query the given lookup path.
|
||||
"""
|
||||
field_name = lookup_path.split('__', 1)[0]
|
||||
field = opts.get_field(field_name)
|
||||
if hasattr(field, 'get_path_info') and any(path.m2m for path in field.get_path_info()):
|
||||
return True
|
||||
lookup_fields = lookup_path.split('__')
|
||||
# Remove the last item of the lookup path if it is a query term
|
||||
if lookup_fields[-1] in QUERY_TERMS:
|
||||
lookup_fields = lookup_fields[:-1]
|
||||
# Now go through the fields (following all relations) and look for an m2m
|
||||
for field_name in lookup_fields:
|
||||
field = opts.get_field(field_name)
|
||||
if hasattr(field, 'get_path_info'):
|
||||
# This field is a relation, update opts to follow the relation
|
||||
path_info = field.get_path_info()
|
||||
opts = path_info[-1].to_opts
|
||||
if any(path.m2m for path in path_info):
|
||||
# This field is a m2m relation so we know we need to call distinct
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user