Con la nueva funcionalidad multi-db de Django en la versión de desarrollo, he estado tratando de crear un comando de administración que nos permita sincronizar los datos del sitio en vivo con un desarrollador máquina para pruebas prolongadas. (Tener datos reales, particularmente los datos ingresados por el usuario, me permite probar una gama más amplia de entradas.)Sincronizando datos entre las bases de datos devel/live en Django
Ahora tengo un comando de trabajo "en su mayoría". Puede sincronizar datos de modelo "simple" pero el problema que tengo es que ignora los campos ManyToMany que no veo ningún motivo para hacerlo. ¿Alguien tiene alguna idea de cómo solucionar eso o una mejor manera de manejar esto? ¿Debo exportar esa primera consulta a un dispositivo primero y luego volver a importarlo?
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
¿Funciona esto para claves externas? –
@Ofri - Si existe un registro con esa PK, funciona, pero asegurarse de que las cosas se crean "en orden" es un poco difícil –
¿Entonces quizás sea el mismo problema para M2M? tienen que ser creados después de sus dos modelos. –