Refs #24227 -- Fixed crash of ManyToManyField.value_from_object() on unsaved model instances.

This behavior was removed in 67d984413c
but is needed to prevent a crash in formtools.
This commit is contained in:
Tim Graham 2016-05-28 15:16:44 -04:00
parent 4f474607de
commit a4c20ae85b
2 changed files with 10 additions and 0 deletions

View File

@ -1565,6 +1565,8 @@ class ManyToManyField(RelatedField):
""" """
Return the value of this field in the given model instance. Return the value of this field in the given model instance.
""" """
if obj.pk is None:
return []
qs = getattr(obj, self.attname).all() qs = getattr(obj, self.attname).all()
if qs._result_cache is not None: if qs._result_cache is not None:
return [item.pk for item in qs] return [item.pk for item in qs]

View File

@ -6,6 +6,14 @@ from django.test.utils import isolate_apps
class ManyToManyFieldTests(SimpleTestCase): class ManyToManyFieldTests(SimpleTestCase):
@isolate_apps('model_fields')
def test_value_from_object_instance_without_pk(self):
class ManyToManyModel(models.Model):
m2m = models.ManyToManyField('self', models.CASCADE)
instance = ManyToManyModel()
self.assertEqual(instance._meta.get_field('m2m').value_from_object(instance), [])
def test_abstract_model_pending_operations(self): def test_abstract_model_pending_operations(self):
""" """
Many-to-many fields declared on abstract models should not add lazy Many-to-many fields declared on abstract models should not add lazy