Chciałbym zmienić nazwę określonych pól w modelu:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
powinien zmienić się na:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Jak najłatwiej to zrobić za pomocą południa?
python
django
django-models
django-south
Jonathan
źródło
źródło
Odpowiedzi:
Możesz użyć tej
db.rename_column
funkcji.Pierwszym argumentem
db.rename_column
jest nazwa tabeli, dlatego ważne jest, aby pamiętać, w jaki sposób Django tworzy nazwy tabel :W przypadku, gdy masz wielowątkową nazwę modelu wielbłądziego, taką jak ProjectItem, nazwą tabeli będzie
app_projectitem
(tzn. Znak podkreślenia nie zostanie wstawiony pomiędzyproject
iitem
nawet jeśli są wielbłądami).źródło
Oto co robię:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Uwaga
renaming_column_x
może być dowolna, jest to tylko sposób na nadanie opisowej nazwy plikowi migracji.Spowoduje to wygenerowanie pliku o nazwie,
myapp/migrations/000x_renaming_column_x.py
który usunie starą kolumnę i doda nową kolumnę.Zmodyfikuj kod w tym pliku, aby zmienić zachowanie migracji na prostą zmianę nazwy:
źródło
x
czycolumn_x
?--auto
migracji pierwszy jest wielkim wskazówka. Pozwala to uniknąć problemów z South ORM Freezer, które występują, jeśli migracja ma tylko metodyforwards
ibackwards
metody, ale nie zawiera zamrożonegomodel
obiektu.db.rename_column
nie zmienia ona nazw ograniczeń związanych z kolumną. Migracja będzie nadal działać, ale będziesz mieć ograniczenia nazwane na podstawie starej nazwy kolumny. Miałem kolumnę z ograniczeniem unikatowości, przemianowałem ją za pomocą tej metody, przetestowałem, czy ograniczenie unikalności nadal istnieje i otrzymałem błąd, ale sama nazwa ograniczenia wciąż używała starej nazwy kolumny. Być może wyraźnedb.delete_unique
idb.create_unique
zrobiłbym to, ale zdecydowałem się na rozwiązanie sjh.Nie wiedziałem o kolumnie db.rename, wydaje się to przydatne, jednak w przeszłości dodawałem nową kolumnę jako jeden schemat migracji, następnie utworzyłem migrację danych, aby przenieść wartości do nowego pola, a następnie drugi schemat, aby usunąć starą kolumnę
źródło
db.rename_column
nie zmieni nazwy ograniczeń, więc musisz sobie z tym poradzić ręcznie. Jeśli zapomnisz to zrobić, migracja będzie działać, z wyjątkiem tego, że bez wiedzy użytkownika może istnieć ograniczenie, które używa starej nazwy kolumny. Nie jest dla mnie jasne, czy kwestia ta ma jedynie charakter kosmetyczny, czy też w przypadku przyszłej migracji, w której należy zmanipulować ograniczenie lub je porzucić, Południe nie będzie w stanie go znaleźć. W każdym razie robienie tego tutaj, jak sugeruje sjh, jest bezpiecznym sposobem: możesz pozwolić Southowi dowiedzieć się, co powinien wiedzieć.Django 1.7 wprowadził migracje, więc teraz nie musisz nawet instalować dodatkowego pakietu do zarządzania migracjami.
Aby zmienić nazwę modelu, musisz najpierw utworzyć pustą migrację:
Następnie musisz edytować kod migracji w następujący sposób:
A potem musisz uruchomić:
źródło
Wystarczy zmienić model i uruchomić
makemigrations
w wersji 1.9Django automatycznie wykrywa, że usunąłeś i utworzyłeś pojedyncze pole, i pyta:
Powiedz tak, a odpowiednia migracja zostanie utworzona. Magia.
źródło
south
do zainstalowanych aplikacji w pliku ustawień projektu.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Jeśli używasz „pycharm”, możesz użyć „ctrl + shift + r” zamiast „manage.py” i „shift” dla parametrów.
źródło