diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 2de9ec8abd2..8add38d6b03 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -1565,6 +1565,8 @@ class ManyToManyField(RelatedField): """ Return the value of this field in the given model instance. """ + if obj.pk is None: + return [] qs = getattr(obj, self.attname).all() if qs._result_cache is not None: return [item.pk for item in qs] diff --git a/tests/model_fields/test_manytomanyfield.py b/tests/model_fields/test_manytomanyfield.py index f368c184034..3134a33197d 100644 --- a/tests/model_fields/test_manytomanyfield.py +++ b/tests/model_fields/test_manytomanyfield.py @@ -6,6 +6,14 @@ from django.test.utils import isolate_apps 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): """ Many-to-many fields declared on abstract models should not add lazy