2009-05-06 35 views
51

mam trochę internetową z kilku użytkowników i chciałbym dodać pole do jednego z moich modeli (i stąd tabel). Problem polega na tym, że syncdb oczywiście nie będzie dotknij istniejących modeli i próbuję dowiedzieć się, jak dodać to pole do modelu/tabeli bez konieczności ponownego zaludnienia całej rzeczy.Dodawanie pola do istniejącego modelu Django

Przykład:

class Newspaper(models.Model): 
    name = models.CharField() 

class UserProfile(models.Model): 
    user = models.ForeignKey(user, unique=True) 
    reads = models.ManyToManyField(Newspaper) 

Teraz chciałbym dodać pole URL (blank=True) do modelu Newspaper bez łamania profile użytkowników.

Wszelkie pomysły?

Odpowiedz

38

Nie ma wbudowanego sposobu, aby to zrobić. Jednak istnieje wiele projektów stron trzecich, które zrobią to za Ciebie. Te dwa wiodące nazywają się South i django-evolution, chociaż są też różne inne (włączając w to jedno, z którym byłem zaangażowany, dmigracje).

Zdecydowanie polecam Południe - ma wiele naprawdę fajnych funkcji i działa naprawdę dobrze.

+0

Myślę, że dobrze jest także wygodnie zmieniać swoje bazy danych, szczególnie gdy chodzi o proste operacje, takie jak dodanie nowej kolumny lub ograniczenia. To świetny sposób na poznanie podstaw baz relacyjnych, a także na temat ORM Django. To bardzo proste, kiedy już wiesz, jak to zrobić. –

+4

czy możesz nam powiedzieć, jak? – holmeswatson

+1

A lata później Południe jest teraz częścią jądra Django. –

18

Można spróbować coraz SQL dla swojej nowej dziedzinie, stosując:

manage.py sql appname 

Gdzie appname to nazwa aplikacji, w której mieszka klasa gazeta.

Następnie można ręcznie dodać pole do tabeli appname_newspaper, używając ALTER TABLE. Nie wiem, jak to zrobić bezpośrednio z Django, ponieważ Django nie obsługuje migracji.

+0

Mała uwaga: jeśli pójdziesz tą drogą, polecam przeprowadzenie migracji (wypełnianie początkowych wartości kolumny) w aplikacji Django , po prostu szukając niezainicjowanych wartości i robiąc to w locie. Próba wypełnienia ich z innej aplikacji może powodować problemy z buforowaniem. –

1

2015 odpowiedź:

Uruchom następujące:

python manage.py makemigrations 
python manage.py migrate 
Powiązane problemy