Экспорт и импорт данных в Django ч.2: сериализация

22 декабря 2018 г. 22:50

Сериализация объектов в Джанго предоставляет механизм преобразования моделей в другие форматы.
Выполняется простой операцией:


from django.core import serializers
data = serializers.serialize("xml", SomeModel.objects.all())

В функцию serialize передаются формат (поддерживается xml, json и yaml) и QuerySet.

Можно указать поля в аргументе fields:

from django.core import serializers
data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))

Десериализация также является очень простой операцией:

for obj in serializers.deserialize("xml", data):
do_something_with(obj)

При этом возвращаются не обычные объекты Джанго, а экземпляры DeserializedObject.
DeserializedObject.save() сохранит объекты в базу.

Может протребоваться выполнить валидации или другие действия, перед тем, как это сделать

for deserialized_object in serializers.deserialize("xml", data):
if object_should_be_saved(deserialized_object):
deserialized_object.save()

Допустим, мы хотим получить все объекты модели User и перенести их в другой проект/базу данных. Можно воспользоваться
стандартными командами dumpdata/loaddata. Если нужно произвести какие-либо манипуляции с данными, то сделать это
можно с помощью скриптов такого вида:

import json
import os

import django
from django.core import serializers

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "inventory.settings.settings")
django.setup()

from django.contrib.auth import get_user_model

User = get_user_model()
users_objects = User.objects.all()
json_string = serializers.serialize('json', users_objects)
data = json.loads(json_string)
for d in data:
del d['pk']
data = json.dumps(data)
with open("users_dump.json", "w") as out:
out.write(data)

В примере выше мы удаляем pk из дампа, т.к. хотим, чтобы они создались автоматически при загрузке.
Файл users_dump.json можно загрузить напрямую
./manage.py loaddata users_dump.json

Если нам нужно произвести, к примеру, валидации объектов, воспользуемся таким скриптом:

import os

import django
from django.core import serializers
from django.core.exceptions import ValidationError

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "inventory.settings.settings")
django.setup()

with open("users_dump.json", "r") as data:
for deserialized_object in serializers.deserialize("json", data):
print(deserialized_object.object)
try:
deserialized_object.object.full_clean()
deserialized_object.save()
print("User {} is created successfully.".format(deserialized_object.object))
except ValidationError as e:
print("User {} is not created. Reason: {}".format(deserialized_object.object, e))

Объекты будут проверены валидаторами, указанными в модели auth.user, результаты будут выведены на экран.

x Удалить пост "Экспорт и импорт данных в Django ч.2: сериализация"?