Commit 914167ab authored by Mariusz Felisiak's avatar Mariusz Felisiak Committed by Tim Graham
Browse files

Fixed #25503 -- Fixed system check crash on ForeignKey to abstract model.

parent 3f766d44
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -449,6 +449,7 @@ answer newbie questions, and generally made Django that much better:
    Marian Andre <django@andre.sk>
    Marijn Vriens <marijn@metronomo.cl>
    Mario Gonzalez <gonzalemario@gmail.com>
    Mariusz Felisiak <felisiak.mariusz@gmail.com>
    Mark Biggers <biggers@utsl.com>
    mark@junklight.com
    Mark Lavin <markdlavin@gmail.com>
+4 −1
Original line number Diff line number Diff line
@@ -461,6 +461,9 @@ class ForeignObject(RelatedField):
        except exceptions.FieldDoesNotExist:
            return []

        if not self.foreign_related_fields:
            return []

        has_unique_field = any(rel_field.unique
            for rel_field in self.foreign_related_fields)
        if not has_unique_field and len(self.foreign_related_fields) > 1:
@@ -563,7 +566,7 @@ class ForeignObject(RelatedField):

    @property
    def foreign_related_fields(self):
        return tuple(rhs_field for lhs_field, rhs_field in self.related_fields)
        return tuple(rhs_field for lhs_field, rhs_field in self.related_fields if rhs_field)

    def get_local_related_value(self, instance):
        return self.get_instance_value_for_fields(instance, self.local_related_fields)
+3 −0
Original line number Diff line number Diff line
@@ -14,3 +14,6 @@ Bugfixes

* Allowed "mode=memory" in SQLite test database name if supported
  (:ticket:`12118`).

* Fixed system check crash on ``ForeignKey`` to abstract model
  (:ticket:`25503`).
+30 −26
Original line number Diff line number Diff line
@@ -386,25 +386,27 @@ class RelativeFieldTests(IsolatedModelsTestCase):
        self.assertEqual(errors, expected)

    def test_foreign_key_to_abstract_model(self):
        class Model(models.Model):
            foreign_key = models.ForeignKey('AbstractModel', models.CASCADE)

        class AbstractModel(models.Model):
            class Meta:
                abstract = True

        field = Model._meta.get_field('foreign_key')
        errors = field.check()
        expected = [
            Error(
        class Model(models.Model):
            rel_string_foreign_key = models.ForeignKey('AbstractModel', models.CASCADE)
            rel_class_foreign_key = models.ForeignKey(AbstractModel, models.CASCADE)

        fields = [
            Model._meta.get_field('rel_string_foreign_key'),
            Model._meta.get_field('rel_class_foreign_key'),
        ]
        expected_error = Error(
            "Field defines a relation with model 'AbstractModel', "
            "which is either not installed, or is abstract.",
                hint=None,
                obj=field,
            id='fields.E300',
            ),
        ]
        self.assertEqual(errors, expected)
        )
        for field in fields:
            expected_error.obj = field
            errors = field.check()
            self.assertEqual(errors, [expected_error])

    def test_m2m_to_abstract_model(self):
        class AbstractModel(models.Model):
@@ -412,20 +414,22 @@ class RelativeFieldTests(IsolatedModelsTestCase):
                abstract = True

        class Model(models.Model):
            m2m = models.ManyToManyField('AbstractModel')
            rel_string_m2m = models.ManyToManyField('AbstractModel')
            rel_class_m2m = models.ManyToManyField(AbstractModel)

        field = Model._meta.get_field('m2m')
        errors = field.check(from_model=Model)
        expected = [
            Error(
        fields = [
            Model._meta.get_field('rel_string_m2m'),
            Model._meta.get_field('rel_class_m2m'),
        ]
        expected_error = Error(
            "Field defines a relation with model 'AbstractModel', "
            "which is either not installed, or is abstract.",
                hint=None,
                obj=field,
            id='fields.E300',
            ),
        ]
        self.assertEqual(errors, expected)
        )
        for field in fields:
            expected_error.obj = field
            errors = field.check(from_model=Model)
            self.assertEqual(errors, [expected_error])

    def test_unique_m2m(self):
        class Person(models.Model):