From 67d984413c9540074e4fe6aa033081a35cf192bc Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Wed, 11 May 2016 10:12:59 -0400 Subject: [PATCH] Refs #24227 -- Removed ManyToManyField special casing in model_to_dict(). --- django/db/models/fields/related.py | 5 ++++- django/forms/models.py | 16 +--------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index 082d663c8b..2de9ec8abd 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -1565,7 +1565,10 @@ class ManyToManyField(RelatedField): """ Return the value of this field in the given model instance. """ - return getattr(obj, self.attname).all() + qs = getattr(obj, self.attname).all() + if qs._result_cache is not None: + return [item.pk for item in qs] + return list(qs.values_list('pk', flat=True)) def save_form_data(self, instance, data): getattr(instance, self.attname).set(data) diff --git a/django/forms/models.py b/django/forms/models.py index 7ba98e1e26..0738421d9e 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -88,21 +88,7 @@ def model_to_dict(instance, fields=None, exclude=None): continue if exclude and f.name in exclude: continue - if f.many_to_many: - # If the object doesn't have a primary key yet, just use an empty - # list for its m2m fields. Calling f.value_from_object will raise - # an exception. - if instance.pk is None: - data[f.name] = [] - else: - # MultipleChoiceWidget needs a list of pks, not object instances. - qs = f.value_from_object(instance) - if qs._result_cache is not None: - data[f.name] = [item.pk for item in qs] - else: - data[f.name] = list(qs.values_list('pk', flat=True)) - else: - data[f.name] = f.value_from_object(instance) + data[f.name] = f.value_from_object(instance) return data