def upsert_item(cls, item: Union[DefaultDict, Model], parent: Model, serializer: ModelSerializer, m2m: Manager): if m2m is not None: m2m.add(item) else: data = cls.clean_data(item) validated = serializer(data=data) if validated.is_valid(): try: validated.instance = serializer.Meta.model.objects.get( pk=data['id']) except (KeyError, serializer.Meta.model.DoesNotExist): pass instance = validated.save() instance.owner = parent instance.save() else: raise ValidationError(validated.errors)