2013-09-06 3 views
3

У нас есть 2 идентичных экземпляра Django, а один - пробный, другой для производства. Недавно один клиент на суде приобрел полный продукт, и мне нужно только ПЕРЕДАТЬ их данные от пробного производства до производства. Я не знаю, если есть удобный способ сделать это, так как:Django: Как перенести часть данных из одного экземпляра в другой?

  1. Если я использую Django светильники, то это может перезаписывать существующие данные в системе производства из-за идентификатора по умолчанию, Django, присвоенным каждому входу (Возможно, я ошибаюсь, но я думаю, что светильники подходят только для инициализации).

  2. Использование sql для сброса базы данных может не помочь ни из-за аналогичной проблемы с первым подходом, но также сложно, потому что в пробной версии есть другие клиенты, но мне нужно только переместить данные этого клиента.

Прошу дать мне совет, если у вас есть аналогичный опыт.

+0

первый подход может быть полезным, но не уверен. что вы подразумеваете под экземпляром здесь, простую запись или объект – drabo2005

+0

@ drabo2005: О, извините, к примеру, я имею в виду веб-сервер, содержащий проект django, а не экземпляр на уровне программирования. –

ответ

4

Проблема заключается в том, что вы не можете перенести первичные ключи (идентификаторы) из пробной версии в производственную БД, не так ли? Так 2 решения:


1) танк, чтобы убить муравей

вы делаете экспорт SQL из базы данных пробных, и вы увеличите каждый первичный ключ и внешний ключ с помощью ряда (напр : 10000). Это число должно достаточно высоко, чтобы избежать Юнисити нарушения ограничений, когда вы будете импортировать его в БД


2) умное решение

Если, и только если ваша модель хорошо разработана: для в каждой модели вы можете найти набор своих столбцов, которые могли бы сделать заменяющий первичный ключ идентификатором. Если у вас есть атрибуты с unique = True, или модели с unique_together = (...), это прекрасно: вы можете использовать natural keys!

В каждой модели исходного кода, можно добавить метод get_by_natural_key:

class Person(models.Model): 
    firstname = models.CharField... 
    last_name = models.CharField... 

    class Meta: 
     unique_together = ("first_name", "last_name") 

    def get_by_natural_key(self, first_name, last_name): 
     return self.get(first_name=first_name, last_name=last_name) 

Затем вы можете использовать Django dumpdata command экспортировать базу данных исследования с идентификаторами заменены естественными ключами! Затем с помощью того же кода вы используете команду loaddata для импорта этих файлов данных.

+0

Я думаю, что моя ситуация относится к первой категории, но мне нравятся новые знания, которые вы предоставили, что я не знаю для второго решения. Благодаря! –

+0

На самом деле первое решение не так сложно: если у вас всего несколько десятков отношений, вы можете легко написать патч SQL, чтобы получить max (id) foreach в своей базе данных prod, а затем еще один патч SQL для обновления Идентификаторы в тестовой БД (возможно, эта часть немного больше тяжелой работы) – Ricola3D

Смежные вопросы