1
0
mirror of https://github.com/django/django.git synced 2025-10-24 22:26:08 +00:00

Fixed #26230 -- Made default_related_name affect related_query_name.

This commit is contained in:
chenesan
2016-02-24 15:10:09 +08:00
committed by Tim Graham
parent 5fb9756eba
commit b84f5ab4ec
8 changed files with 97 additions and 8 deletions

View File

@@ -290,8 +290,13 @@ class RelatedField(Field):
if not cls._meta.abstract:
if self.remote_field.related_name:
related_name = force_text(self.remote_field.related_name) % {
related_name = self.remote_field.related_name
else:
related_name = self.opts.default_related_name
if related_name:
related_name = force_text(related_name) % {
'class': cls.__name__.lower(),
'model_name': cls._meta.model_name.lower(),
'app_label': cls._meta.app_label.lower()
}
self.remote_field.related_name = related_name

View File

@@ -187,11 +187,6 @@ class ForeignObjectRel(object):
return None
if self.related_name:
return self.related_name
if opts.default_related_name:
return opts.default_related_name % {
'model_name': opts.model_name.lower(),
'app_label': opts.app_label.lower(),
}
return opts.model_name + ('_set' if self.multiple else '')
def get_cache_name(self):

View File

@@ -7,6 +7,7 @@ databases). The abstraction barrier only works one way: this module has to know
all about the internals of models in order to get the information it needs.
"""
import copy
import warnings
from collections import Counter, Iterator, Mapping, OrderedDict
from itertools import chain, count, product
from string import ascii_uppercase
@@ -30,6 +31,7 @@ from django.db.models.sql.where import (
AND, OR, ExtraWhere, NothingNode, WhereNode,
)
from django.utils import six
from django.utils.deprecation import RemovedInDjango20Warning
from django.utils.encoding import force_text
from django.utils.tree import Node
@@ -1288,6 +1290,19 @@ class Query(object):
except FieldDoesNotExist:
if name in self.annotation_select:
field = self.annotation_select[name].output_field
elif pos == 0:
for rel in opts.related_objects:
if (name == rel.related_model._meta.model_name and
rel.related_name == rel.related_model._meta.default_related_name):
related_name = rel.related_name
field = opts.get_field(related_name)
warnings.warn(
"Query lookup '%s' is deprecated in favor of "
"Meta.default_related_name '%s'."
% (name, related_name),
RemovedInDjango20Warning, 2
)
break
if field is not None:
# Fields that contain one-to-many relations with a generic