Fixed #27651 -- Allowed M2M to concrete and proxy through model.
This commit is contained in:
parent
aaecf038ca
commit
e3e80da7a5
|
@ -1447,8 +1447,10 @@ class ManyToManyField(RelatedField):
|
||||||
if model != self.remote_field.through and model._meta.managed
|
if model != self.remote_field.through and model._meta.managed
|
||||||
}
|
}
|
||||||
m2m_db_table = self.m2m_db_table()
|
m2m_db_table = self.m2m_db_table()
|
||||||
if m2m_db_table in registered_tables:
|
model = registered_tables.get(m2m_db_table)
|
||||||
model = registered_tables[m2m_db_table]
|
# The second condition allows multiple m2m relations on a model if
|
||||||
|
# some point to a through model that proxies another through model.
|
||||||
|
if model and model._meta.concrete_model != self.remote_field.through._meta.concrete_model:
|
||||||
if model._meta.auto_created:
|
if model._meta.auto_created:
|
||||||
def _get_field_name(model):
|
def _get_field_name(model):
|
||||||
for field in model._meta.auto_created._meta.many_to_many:
|
for field in model._meta.auto_created._meta.many_to_many:
|
||||||
|
|
|
@ -899,6 +899,24 @@ class OtherModelTests(SimpleTestCase):
|
||||||
self.assertEqual(C1.check(), [])
|
self.assertEqual(C1.check(), [])
|
||||||
self.assertEqual(C2.check(), [])
|
self.assertEqual(C2.check(), [])
|
||||||
|
|
||||||
|
def test_m2m_to_concrete_and_proxy_allowed(self):
|
||||||
|
class A(models.Model):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Through(models.Model):
|
||||||
|
a = models.ForeignKey('A', models.CASCADE)
|
||||||
|
c = models.ForeignKey('C', models.CASCADE)
|
||||||
|
|
||||||
|
class ThroughProxy(Through):
|
||||||
|
class Meta:
|
||||||
|
proxy = True
|
||||||
|
|
||||||
|
class C(models.Model):
|
||||||
|
mm_a = models.ManyToManyField(A, through=Through)
|
||||||
|
mm_aproxy = models.ManyToManyField(A, through=ThroughProxy, related_name='proxied_m2m')
|
||||||
|
|
||||||
|
self.assertEqual(C.check(), [])
|
||||||
|
|
||||||
@isolate_apps('django.contrib.auth', kwarg_name='apps')
|
@isolate_apps('django.contrib.auth', kwarg_name='apps')
|
||||||
def test_lazy_reference_checks(self, apps):
|
def test_lazy_reference_checks(self, apps):
|
||||||
class DummyModel(models.Model):
|
class DummyModel(models.Model):
|
||||||
|
|
Loading…
Reference in New Issue