Десериализация json в объект python без фактического сохранения объекта в БД

Я использую Django и классы моделей для доступа к данным из БД. Я хотел бы добавить слой кэширования поверх DB.

Например, допустим, у меня есть модель User и UserSerializer (унаследованный от ModelSerializer). При хранении объекта User в кэше мне нужно сериализовать объект в json

import json
serializer = UserSerializer(obj)
serialized_data = json.dumps(serializer.data)

Однако, когда я извлекаю этот json из кэша, у меня возникли проблемы с преобразованием его обратно в объект User

data = json.loads(serialized_data)
deserializer = UserSerializer(data=data)
user_obj = deserializer.save() # this return an User object but intenally it will create a new record in DB

Есть идеи, как я могу использовать сериализатор, предоставленный django, для десериализации json в объект без фактического создания записи в DB?

Вы можете просто использовать модель для создания объекта с serializer.validated_data без фактического сохранения его в базе данных:

serializer = UserSerializer(data=data)
serializer.is_valid(raise_exception=True)
user_obj = User(**serializer.validated_data)

Однако важно отметить, что вам придется вручную работать с отношениями ManyToMany, если в вашей модели они есть и сериализатор принимает их в качестве поля.

Если у вас есть ManyToManyField и вы не хотите разбираться с ней вручную, вы также можете вызвать deserializer.save() в атомарной транзакции и сразу после этого вызвать исключение, которое создаст переменную user_obj без фиксации изменений в базе данных:

from django.db import transaction, NotSupportedError

serializer = UserSerializer(data=data)
serializer.is_valid(raise_exception=True)
try:
    with transaction.atomic():
        user_obj = serializer.save()
        raise NotSupportedError
except NotSupportedError:
    pass
Вернуться на верх