python matplotlib - Django-Wie kann man ein Modellfeld mit South umbenennen?




title position (6)

Ich möchte den Namen bestimmter Felder in einem Modell ändern:

class Foo(models.Model):
    name = models.CharField()
    rel  = models.ForeignKey(Bar)

sollte sich ändern zu:

class Foo(models.Model):
    full_name     = models.CharField()
    odd_relation  = models.ForeignKey(Bar)

Was ist der einfachste Weg, dies mit South zu tun?


Answers

Ändern Sie einfach das Modell und führen Sie makemigrations in 1.9 aus

Django erkennt automatisch, dass Sie ein einzelnes Feld gelöscht und erstellt haben, und fragt:

Did you rename model.old to model.new (a IntegerField)? [y/N]

Sagen Sie ja, und die richtige Migration wird erstellt. Zauber.


Django 1.7 hat Migrations eingeführt, sodass Sie jetzt nicht einmal ein zusätzliches Paket installieren müssen, um Ihre Migrationen zu verwalten.

Um Ihr Modell umzubenennen, müssen Sie zunächst eine leere Migration erstellen:

$ manage.py makemigrations <app_name> --empty

Dann müssen Sie den Code Ihrer Migration wie folgt bearbeiten:

from django.db import models, migrations

class Migration(migrations.Migration):

dependencies = [
    ('yourapp', 'XXXX_your_previous_migration'),
]

operations = [
    migrations.RenameField(
        model_name='Foo',
        old_name='name',
        new_name='full_name'
    ),
    migrations.RenameField(
        model_name='Foo',
        old_name='rel',
        new_name='odd_relation'
    ),
]

Und danach musst du laufen:

$ manage.py migrate <app_name>

Folgendes mache ich:

  1. Ändern Sie den Spaltennamen in Ihrem Modell (in diesem Beispiel wäre dies myapp/models.py )
  2. Führen Sie ./manage.py schemamigration myapp renaming_column_x --auto

Hinweis renaming_column_x kann alles sein, was Sie möchten, es ist nur eine Möglichkeit, der Migrationsdatei einen aussagekräftigen Namen zu geben.

Dies erzeugt eine Datei namens myapp/migrations/000x_renaming_column_x.py die Ihre alte Spalte löscht und eine neue Spalte hinzufügt.

Ändern Sie den Code in dieser Datei, um das Migrationsverhalten in eine einfache Umbenennung zu ändern:

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Renaming column 'mymodel.old_column_name' to 'mymodel.new_column_name'
        db.rename_column(u'myapp_mymodel', 'old_column_name', 'new_column_name')

    def backwards(self, orm):
        # Renaming column 'mymodel.new_column_name' to 'mymodel.old_column_name'
        db.rename_column(u'myapp_mymodel', 'new_column_name', 'old_column_name')

Ich wusste nicht über db.rename Spalte, klingt praktisch, aber in der Vergangenheit habe ich die neue Spalte als eine Schemamigration hinzugefügt, dann eine Datamigration erstellt, um Werte in das neue Feld zu verschieben, dann eine zweite Schemamigration, um die alte Spalte zu entfernen


  1. Fügen Sie den installierten Apps in der Projekteinstellungsdatei den south .
  2. Kommentieren Sie das hinzugefügte / geänderte Feld / Tabelle.
  3. $ manage.py Schemamigration <app_name> --initial
  4. $ manage.py migrate <app_name> --Fake
  5. Unkommentieren Sie das Feld und schreiben Sie das geänderte Feld
  6. $ manage.py Schemamigration --auto
  7. $ manage.py migrate <app_name>

Wenn Sie 'pycharm' verwenden, können Sie 'ctrl + shift + r' anstelle von 'manage.py' und 'shift' für Parameter verwenden.


Eine Alternative:

% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z1=dict(x.items() + y.items())'
100000 loops, best of 3: 5.67 usec per loop
% python -m timeit -s 'x=y=dict((i,i) for i in range(20))' 'z2=dict(x, **y)' 
100000 loops, best of 3: 1.53 usec per loop




python django django-models django-south