11from django .contrib .humanize .templatetags .humanize import ordinal
22from django .core .exceptions import ValidationError
3- from django .db import transaction
3+ from django .db import transaction , models
44from django .urls import reverse
55from django .utils .translation import gettext_lazy as _
66from rest_framework import serializers
77from rest_framework .serializers import IntegerField , SerializerMethodField
88from rest_framework_gis import serializers as gis_serializers
99from swapper import load_model
10-
10+ from copy import copy
1111from openwisp_utils .api .serializers import ValidatedModelSerializer
1212
1313from ...serializers import BaseSerializer
@@ -29,6 +29,18 @@ class Meta:
2929 fields = "__all__"
3030 read_only_fields = ["id" , "organization" ]
3131
32+ # Workaround for https://github.com/openwisp/openwisp-utils/issues/633
33+ # TODO: Remove when the Bug is fixed in openwisp-utils
34+ def validate (self , data ):
35+ Model = self .Meta .model
36+ instance = copy (self .instance ) if self .instance else Model ()
37+ for key , value in data .items ():
38+ # avoid direct assignment for m2m (not allowed)
39+ if not isinstance (Model ._meta .get_field (key ), models .ManyToManyField ):
40+ setattr (instance , key , value )
41+ instance .full_clean (exclude = self .exclude_validation )
42+ return data
43+
3244
3345class LocationDeviceSerializer (ValidatedModelSerializer ):
3446 admin_edit_url = SerializerMethodField ("get_admin_edit_url" )
0 commit comments