Решение для создания инкрементных данных для передачи на боевой сервер и наката их там.
На нужные модели вешаем сигналы post_delete для сохранения модель - id в модель удаленных объектов.
Привожу код создания файлов.
Чуть позже тут размещу ссылку на статью с более подробным описанием:
- Создания файлов изменений
- Накате с созданием файлов отката
- Откате изменений
# coding=utf-8
from datetime import datetime
from os import makedirs, listdir
import json
from django.core import serializers
from django.core.management.base import BaseCommand
from optparse import make_option
from django.db.models.loading import get_model
from django.conf import settings
class Command(BaseCommand):
help = """
Create difsettings from timestamp.
Usage: manage.py docflow_diffsettings_create '2014-01-01'
"""
option_list = BaseCommand.option_list + (
make_option('--from',
action="store",
type="string",
dest='from',
help='timestamp: changed from argument to current DateTime'),
make_option('--project_id',
action="store",
type="int",
dest='project_id',
help='Docflow project number'),
)
def __init__(self, *vargs, **kwargs):
super(Command, self).__init__(*vargs, **kwargs)
self._datetime_format = '%Y-%m-%d %H:%M'
def handle(self, *args, **options):
date_to = datetime.now()
date_from = datetime.strptime(options['from'], self._datetime_format)
project_id = options["project_id"]
project_folder = "%s/docflow/diffsettings/%s" % (settings.BASE_DIR, project_id,)
folder_path = "%s/%s > %s" % (project_folder,
date_from.strftime(self._datetime_format),
date_to.strftime(self._datetime_format))
makedirs(folder_path)
JSONSerializer = serializers.get_serializer("json")
json_serializer = JSONSerializer()
models_paths = set()
for model_path in args:
models_paths.add(model_path)
# deleted objects
models_paths.add('docflow.ObjectsDeleted')
# create files
for model_path in models_paths:
application_name, model_name = model_path.split('.')
model = get_model(application_name, model_name)
objects_changed = model.objects.filter(d_change__range=(date_from,
date_to))
# Обязательно наличие файла, даже если нет ни одной измененной модели
# это необходимо для создания бэкапа при накате настроек
# (если по модели нет изменившихся, но есть удаленные объекты)
# Создание файла отката настроек происходит
# внутри итерации перебота этих файлов
with open("%s/%s.json" % (folder_path, model_path), "w") as out:
json_serializer.serialize(objects_changed, stream=out, indent=4)