Fixes #18884: Handle tag assignments manually within deserialize_object (#18908)

This commit is contained in:
Jeremy Stretch 2025-03-17 11:43:08 -04:00 committed by GitHub
parent 0094703609
commit f86647dc28
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,5 +1,6 @@
import json
from django.apps import apps
from django.contrib.contenttypes.models import ContentType
from django.core import serializers
@ -56,8 +57,17 @@ def deserialize_object(model, fields, pk=None):
the complement to serialize_object().
"""
content_type = ContentType.objects.get_for_model(model)
m2m_data = {}
# Account for custom field data
if 'custom_fields' in fields:
fields['custom_field_data'] = fields.pop('custom_fields')
# Pop any assigned tags to handle the M2M relationships manually
if is_taggable(model) and fields.get('tags'):
Tag = apps.get_model('extras', 'Tag')
m2m_data['tags'] = Tag.objects.filter(name__in=fields.pop('tags'))
data = {
'model': '.'.join(content_type.natural_key()),
'pk': pk,
@ -65,4 +75,7 @@ def deserialize_object(model, fields, pk=None):
}
instance = list(serializers.deserialize('python', [data]))[0]
# Apply any additional M2M assignments
instance.m2m_data.update(**m2m_data)
return instance