Bladeren bron

refactor(api): separately index RRsets by subname, type in serializer

Peter Thomassen 4 jaren geleden
bovenliggende
commit
6d210b7690
1 gewijzigde bestanden met toevoegingen van 6 en 4 verwijderingen
  1. 6 4
      api/desecapi/serializers.py

+ 6 - 4
api/desecapi/serializers.py

@@ -360,23 +360,25 @@ class RRsetListSerializer(serializers.ListSerializer):
             known_instances = {(x.subname, x.type): x for x in self.instance}
         except TypeError:  # in case self.instance is None (as during POST)
             known_instances = {}
-        indices_by_key = {}
+        indices = {}
         for idx, item in enumerate(data):
             # Validate item type before using anything from it
             if not isinstance(item, dict):
                 self.fail('invalid', datatype=type(item).__name__)
-            items = indices_by_key.setdefault(self._key(item), set())
+            s, t = self._key(item)  # subname, type
+            items = indices.setdefault(s, {}).setdefault(t, set())
             items.add(idx)
 
         # Iterate over all rows in the data given
         for idx, item in enumerate(data):
             try:
                 # see if other rows have the same key
-                if len(indices_by_key[self._key(item)]) > 1:
+                s, t = self._key(item)
+                if len(indices[s][t]) > 1:
                     raise serializers.ValidationError({
                         'non_field_errors': [
                             'Same subname and type as in position(s) %s, but must be unique.' %
-                            ', '.join(map(str, indices_by_key[self._key(item)] - {idx}))
+                            ', '.join(map(str, indices[s][t] - {idx}))
                         ]
                     })