Десериализация 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