summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2015-11-09 16:50:40 -0500
committerSimon Charette <charette.s@gmail.com>2015-11-14 12:08:33 -0500
commitc049c43e28a3e46eaed13bb8e018b221250a0145 (patch)
tree50a70fa2b0d836a2bb5b7dfb53fa0656fb165756
parent84006fda55ffcaf272ca4fcd4addf7874302e884 (diff)
[1.9.x] Fixed #25723 -- Made related field checks lookup against their local apps.
Backport of c550beb0ccc8855fde7ff50ada530f7ceff1a595 from master
-rw-r--r--django/db/models/fields/related.py6
-rw-r--r--tests/invalid_models_tests/test_relative_fields.py68
2 files changed, 71 insertions, 3 deletions
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index f10a32ae39..978f71ace4 100644
--- a/django/db/models/fields/related.py
+++ b/django/db/models/fields/related.py
@@ -149,7 +149,7 @@ class RelatedField(Field):
return []
def _check_relation_model_exists(self):
- rel_is_missing = self.remote_field.model not in apps.get_models()
+ rel_is_missing = self.remote_field.model not in self.opts.apps.get_models()
rel_is_string = isinstance(self.remote_field.model, six.string_types)
model_name = self.remote_field.model if rel_is_string else self.remote_field.model._meta.object_name
if rel_is_missing and (rel_is_string or not self.remote_field.model._meta.swapped):
@@ -165,7 +165,7 @@ class RelatedField(Field):
return []
def _check_referencing_to_swapped_model(self):
- if (self.remote_field.model not in apps.get_models() and
+ if (self.remote_field.model not in self.opts.apps.get_models() and
not isinstance(self.remote_field.model, six.string_types) and
self.remote_field.model._meta.swapped):
model = "%s.%s" % (
@@ -1206,7 +1206,7 @@ class ManyToManyField(RelatedField):
errors = []
- if self.remote_field.through not in apps.get_models(include_auto_created=True):
+ if self.remote_field.through not in self.opts.apps.get_models(include_auto_created=True):
# The relationship model is not installed.
errors.append(
checks.Error(
diff --git a/tests/invalid_models_tests/test_relative_fields.py b/tests/invalid_models_tests/test_relative_fields.py
index bfdd2b7d7a..3ec9af2cb0 100644
--- a/tests/invalid_models_tests/test_relative_fields.py
+++ b/tests/invalid_models_tests/test_relative_fields.py
@@ -3,6 +3,7 @@ from __future__ import unicode_literals
import warnings
+from django.apps.registry import Apps
from django.core.checks import Error, Warning as DjangoWarning
from django.db import models
from django.db.models.fields.related import ForeignObject
@@ -132,6 +133,26 @@ class RelativeFieldTests(IsolatedModelsTestCase):
]
self.assertEqual(errors, expected)
+ def test_foreign_key_to_isolated_apps_model(self):
+ """
+ #25723 - Referenced model registration lookup should be run against the
+ field's model registry.
+ """
+ test_apps = Apps(['invalid_models_tests'])
+
+ class OtherModel(models.Model):
+ class Meta:
+ apps = test_apps
+
+ class Model(models.Model):
+ foreign_key = models.ForeignKey('OtherModel', models.CASCADE)
+
+ class Meta:
+ apps = test_apps
+
+ field = Model._meta.get_field('foreign_key')
+ self.assertEqual(field.check(from_model=Model), [])
+
def test_many_to_many_to_missing_model(self):
class Model(models.Model):
m2m = models.ManyToManyField("Rel2")
@@ -149,6 +170,26 @@ class RelativeFieldTests(IsolatedModelsTestCase):
]
self.assertEqual(errors, expected)
+ def test_many_to_many_to_isolated_apps_model(self):
+ """
+ #25723 - Referenced model registration lookup should be run against the
+ field's model registry.
+ """
+ test_apps = Apps(['invalid_models_tests'])
+
+ class OtherModel(models.Model):
+ class Meta:
+ apps = test_apps
+
+ class Model(models.Model):
+ m2m = models.ManyToManyField('OtherModel')
+
+ class Meta:
+ apps = test_apps
+
+ field = Model._meta.get_field('m2m')
+ self.assertEqual(field.check(from_model=Model), [])
+
def test_many_to_many_with_useless_options(self):
class Model(models.Model):
name = models.CharField(max_length=20)
@@ -288,6 +329,33 @@ class RelativeFieldTests(IsolatedModelsTestCase):
]
self.assertEqual(errors, expected)
+ def test_many_to_many_through_isolated_apps_model(self):
+ """
+ #25723 - Through model registration lookup should be run against the
+ field's model registry.
+ """
+ test_apps = Apps(['invalid_models_tests'])
+
+ class GroupMember(models.Model):
+ person = models.ForeignKey('Person', models.CASCADE)
+ group = models.ForeignKey('Group', models.CASCADE)
+
+ class Meta:
+ apps = test_apps
+
+ class Person(models.Model):
+ class Meta:
+ apps = test_apps
+
+ class Group(models.Model):
+ members = models.ManyToManyField('Person', through='GroupMember')
+
+ class Meta:
+ apps = test_apps
+
+ field = Group._meta.get_field('members')
+ self.assertEqual(field.check(from_model=Group), [])
+
def test_symmetrical_self_referential_field(self):
class Person(models.Model):
# Implicit symmetrical=False.