Skip to content

Commit 67d9844

Browse files
committed
Refs #24227 -- Removed ManyToManyField special casing in model_to_dict().
1 parent 8f6a1a1 commit 67d9844

File tree

2 files changed

+5
-16
lines changed

2 files changed

+5
-16
lines changed

django/db/models/fields/related.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1565,7 +1565,10 @@ def value_from_object(self, obj):
15651565
"""
15661566
Return the value of this field in the given model instance.
15671567
"""
1568-
return getattr(obj, self.attname).all()
1568+
qs = getattr(obj, self.attname).all()
1569+
if qs._result_cache is not None:
1570+
return [item.pk for item in qs]
1571+
return list(qs.values_list('pk', flat=True))
15691572

15701573
def save_form_data(self, instance, data):
15711574
getattr(instance, self.attname).set(data)

django/forms/models.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,7 @@ def model_to_dict(instance, fields=None, exclude=None):
8888
continue
8989
if exclude and f.name in exclude:
9090
continue
91-
if f.many_to_many:
92-
# If the object doesn't have a primary key yet, just use an empty
93-
# list for its m2m fields. Calling f.value_from_object will raise
94-
# an exception.
95-
if instance.pk is None:
96-
data[f.name] = []
97-
else:
98-
# MultipleChoiceWidget needs a list of pks, not object instances.
99-
qs = f.value_from_object(instance)
100-
if qs._result_cache is not None:
101-
data[f.name] = [item.pk for item in qs]
102-
else:
103-
data[f.name] = list(qs.values_list('pk', flat=True))
104-
else:
105-
data[f.name] = f.value_from_object(instance)
91+
data[f.name] = f.value_from_object(instance)
10692
return data
10793

10894

0 commit comments

Comments
 (0)