mirror of
https://github.com/django/django.git
synced 2025-08-03 10:34:04 +00:00
Fixed #30421 -- Allowed symmetrical intermediate table for self-referential ManyToManyField.
This commit is contained in:
parent
a9179ab032
commit
87b1ad6e73
11 changed files with 167 additions and 90 deletions
|
@ -260,24 +260,6 @@ class RelativeFieldTests(SimpleTestCase):
|
|||
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.
|
||||
friends = models.ManyToManyField('self', through="Relationship")
|
||||
|
||||
class Relationship(models.Model):
|
||||
first = models.ForeignKey(Person, models.CASCADE, related_name="rel_from_set")
|
||||
second = models.ForeignKey(Person, models.CASCADE, related_name="rel_to_set")
|
||||
|
||||
field = Person._meta.get_field('friends')
|
||||
self.assertEqual(field.check(from_model=Person), [
|
||||
Error(
|
||||
'Many-to-many fields with intermediate tables must not be symmetrical.',
|
||||
obj=field,
|
||||
id='fields.E332',
|
||||
),
|
||||
])
|
||||
|
||||
def test_too_many_foreign_keys_in_self_referential_model(self):
|
||||
class Person(models.Model):
|
||||
friends = models.ManyToManyField('self', through="InvalidRelationship", symmetrical=False)
|
||||
|
@ -301,52 +283,6 @@ class RelativeFieldTests(SimpleTestCase):
|
|||
),
|
||||
])
|
||||
|
||||
def test_symmetric_self_reference_with_intermediate_table(self):
|
||||
class Person(models.Model):
|
||||
# Explicit symmetrical=True.
|
||||
friends = models.ManyToManyField('self', through="Relationship", symmetrical=True)
|
||||
|
||||
class Relationship(models.Model):
|
||||
first = models.ForeignKey(Person, models.CASCADE, related_name="rel_from_set")
|
||||
second = models.ForeignKey(Person, models.CASCADE, related_name="rel_to_set")
|
||||
|
||||
field = Person._meta.get_field('friends')
|
||||
self.assertEqual(field.check(from_model=Person), [
|
||||
Error(
|
||||
'Many-to-many fields with intermediate tables must not be symmetrical.',
|
||||
obj=field,
|
||||
id='fields.E332',
|
||||
),
|
||||
])
|
||||
|
||||
def test_symmetric_self_reference_with_intermediate_table_and_through_fields(self):
|
||||
"""
|
||||
Using through_fields in a m2m with an intermediate model shouldn't
|
||||
mask its incompatibility with symmetry.
|
||||
"""
|
||||
class Person(models.Model):
|
||||
# Explicit symmetrical=True.
|
||||
friends = models.ManyToManyField(
|
||||
'self',
|
||||
symmetrical=True,
|
||||
through="Relationship",
|
||||
through_fields=('first', 'second'),
|
||||
)
|
||||
|
||||
class Relationship(models.Model):
|
||||
first = models.ForeignKey(Person, models.CASCADE, related_name="rel_from_set")
|
||||
second = models.ForeignKey(Person, models.CASCADE, related_name="rel_to_set")
|
||||
referee = models.ForeignKey(Person, models.CASCADE, related_name="referred")
|
||||
|
||||
field = Person._meta.get_field('friends')
|
||||
self.assertEqual(field.check(from_model=Person), [
|
||||
Error(
|
||||
'Many-to-many fields with intermediate tables must not be symmetrical.',
|
||||
obj=field,
|
||||
id='fields.E332',
|
||||
),
|
||||
])
|
||||
|
||||
def test_foreign_key_to_abstract_model(self):
|
||||
class AbstractModel(models.Model):
|
||||
class Meta:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue