Просмотр исходного кода

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

Jeremy Stretch 11 месяцев назад
Родитель
Сommit
f86647dc28
1 измененных файлов с 13 добавлено и 0 удалено
  1. 13 0
      netbox/utilities/serialization.py

+ 13 - 0
netbox/utilities/serialization.py

@@ -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