С новой многофункциональной функциональностью Django в версии разработки я пытался работать над созданием команды управления, которая позволяет мне синхронизировать данные с сайта live до разработчика машина для расширенного тестирования. (Имея фактические данные, в частности введенные пользователем данные, позволяет мне тестировать более широкий диапазон входов.)Синхронизация данных между базами данных devel/live в Django
Прямо сейчас у меня есть «основная» рабочая команда. Он может синхронизировать «простые» данные модели, но проблема, с которой я сталкиваюсь, заключается в том, что она игнорирует поля ManyToMany, которые я не вижу в этом никаких причин. У кого-нибудь есть идеи о том, как исправить это или лучше хотеть справиться с этим? Должен ли я сначала экспортировать этот первый запрос на прибор, а затем повторно импортировать его?
from django.core.management.base import LabelCommand
from django.db.utils import IntegrityError
from django.db import models
from django.conf import settings
LIVE_DATABASE_KEY = 'live'
class Command(LabelCommand):
help = ("Synchronizes the data between the local machine and the live server")
args = "APP_NAME"
label = 'application name'
requires_model_validation = False
can_import_settings = True
def handle_label(self, label, **options):
# Make sure we're running the command on a developer machine and that we've got the right settings
db_settings = getattr(settings, 'DATABASES', {})
if not LIVE_DATABASE_KEY in db_settings:
print 'Could not find "%s" in database settings.' % LIVE_DATABASE_KEY
return
if db_settings.get('default') == db_settings.get(LIVE_DATABASE_KEY):
print 'Data cannot synchronize with self. This command must be run on a non-production server.'
return
# Fetch all models for the given app
try:
app = models.get_app(label)
app_models = models.get_models(app)
except:
print "The app '%s' could not be found or models could not be loaded for it." % label
for model in app_models:
print 'Syncing %s.%s ...' % (model._meta.app_label, model._meta.object_name)
# Query each model from the live site
qs = model.objects.all().using(LIVE_DATABASE_KEY)
# ...and save it to the local database
for record in qs:
try:
record.save(using='default')
except IntegrityError:
# Skip as the record probably already exists
pass
Это работает для внешних ключей? –
@Ofri - Если запись с этим PK существует, она работает, но убедитесь, что все создано «по порядку» немного сложно –
Тогда, может быть, это та же проблема для M2M? они должны быть созданы после обеих моделей. –