mirror of
https://github.com/django/django.git
synced 2025-01-03 06:55:47 +00:00
Fixed #30409 -- Allowed using foreign key's attnames in unique/index_together and Index's fields.
This commit is contained in:
parent
2106b983c4
commit
6485a5f450
1
AUTHORS
1
AUTHORS
@ -918,6 +918,7 @@ answer newbie questions, and generally made Django that much better:
|
|||||||
Žan Anderle <zan.anderle@gmail.com>
|
Žan Anderle <zan.anderle@gmail.com>
|
||||||
Zbigniew Siciarz <zbigniew@siciarz.net>
|
Zbigniew Siciarz <zbigniew@siciarz.net>
|
||||||
zegor
|
zegor
|
||||||
|
Zeynel Özdemir <ozdemir.zynl@gmail.com>
|
||||||
Zlatko Mašek <zlatko.masek@gmail.com>
|
Zlatko Mašek <zlatko.masek@gmail.com>
|
||||||
<Please alphabetize new entries>
|
<Please alphabetize new entries>
|
||||||
|
|
||||||
|
@ -1571,9 +1571,11 @@ class Model(metaclass=ModelBase):
|
|||||||
|
|
||||||
# In order to avoid hitting the relation tree prematurely, we use our
|
# In order to avoid hitting the relation tree prematurely, we use our
|
||||||
# own fields_map instead of using get_field()
|
# own fields_map instead of using get_field()
|
||||||
forward_fields_map = {
|
forward_fields_map = {}
|
||||||
field.name: field for field in cls._meta._get_fields(reverse=False)
|
for field in cls._meta._get_fields(reverse=False):
|
||||||
}
|
forward_fields_map[field.name] = field
|
||||||
|
if hasattr(field, 'attname'):
|
||||||
|
forward_fields_map[field.attname] = field
|
||||||
|
|
||||||
errors = []
|
errors = []
|
||||||
for field_name in fields:
|
for field_name in fields:
|
||||||
|
@ -117,6 +117,19 @@ class IndexTogetherTests(SimpleTestCase):
|
|||||||
),
|
),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_pointing_to_fk(self):
|
||||||
|
class Foo(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Bar(models.Model):
|
||||||
|
foo_1 = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bar_1')
|
||||||
|
foo_2 = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bar_2')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
index_together = [['foo_1_id', 'foo_2']]
|
||||||
|
|
||||||
|
self.assertEqual(Bar.check(), [])
|
||||||
|
|
||||||
|
|
||||||
# unique_together tests are very similar to index_together tests.
|
# unique_together tests are very similar to index_together tests.
|
||||||
@isolate_apps('invalid_models_tests')
|
@isolate_apps('invalid_models_tests')
|
||||||
@ -204,6 +217,19 @@ class UniqueTogetherTests(SimpleTestCase):
|
|||||||
),
|
),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_pointing_to_fk(self):
|
||||||
|
class Foo(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Bar(models.Model):
|
||||||
|
foo_1 = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bar_1')
|
||||||
|
foo_2 = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bar_2')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = [['foo_1_id', 'foo_2']]
|
||||||
|
|
||||||
|
self.assertEqual(Bar.check(), [])
|
||||||
|
|
||||||
|
|
||||||
@isolate_apps('invalid_models_tests')
|
@isolate_apps('invalid_models_tests')
|
||||||
class IndexesTests(SimpleTestCase):
|
class IndexesTests(SimpleTestCase):
|
||||||
@ -257,6 +283,19 @@ class IndexesTests(SimpleTestCase):
|
|||||||
),
|
),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
def test_pointing_to_fk(self):
|
||||||
|
class Foo(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Bar(models.Model):
|
||||||
|
foo_1 = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bar_1')
|
||||||
|
foo_2 = models.ForeignKey(Foo, on_delete=models.CASCADE, related_name='bar_2')
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
indexes = [models.Index(fields=['foo_1_id', 'foo_2'], name='index_name')]
|
||||||
|
|
||||||
|
self.assertEqual(Bar.check(), [])
|
||||||
|
|
||||||
|
|
||||||
@isolate_apps('invalid_models_tests')
|
@isolate_apps('invalid_models_tests')
|
||||||
class FieldNamesTests(SimpleTestCase):
|
class FieldNamesTests(SimpleTestCase):
|
||||||
|
Loading…
Reference in New Issue
Block a user