У меня возникла новая острая проблема - как добавить дополнительное поле в существующую модель? Один раз я уже сталкивался с такой ситуацией, так и не нашел решение и в результате вынужден был удалить базу данных sqlite3 и создать ее заново, уже на основе новой моделей. Сейчас для меня такое решение уже неприемлемо - надо обязателльно сделать "тонкую" операцию.
Постараюсь описать ситуацию. В модели BlogPost (это таблица, в которой содержтся посты для блога в рамках моего проекта) до последнего момента отсутствовал автор. Теперь я хочу добавить поле author и увязать его с моделью User. Итак, в файле models.py пишем:
from django.db import models
from django.contrib import admin
from django.contrib.auth.models import User
# Create your models here.
class BlogPost(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
timestamp = models.DateTimeField()
author = models.ForeignKey(User)
def get_absolute_url(self):
return '/blog/%s/' % str(self.id)
Новым является поле author (раньше его не было). Естественно, что выполнение следующей команды:
$python manage.py syncdb
ни к чему не привело. Никакого поля author в соответствующей таблице BlogPost создано не было. Начал искать решение. Первое что нашел - это пост
Adding a field to an existing Django model. В комментариях сказано, что в Django отсутствуют встроенные возможности решения данной проблемы. Но зато есть ряд приложений от третьих лиц, которые заточены в том числе и под решение этого вопроса. В частности, рекомендуют:
1)
South 2)
django-evolution Причем больше всего рекомендуют именно South. К числе
ключевых особенностей этого продукта относят следующие:
- Автоматическая миграция - South просматривает модели в файлах models.py, сопоставляет с базой данных и автоматически производит нужные изменения
- Независимость от базы данных: - насколько это возможно, South независит от базы данных и на данном этапе поддерживает взамиодействие с пятью разными базами данных
- "Умное приложение" - South знает и реализует концепцию Django-приложений, что позволяет использовать миграцию для ваших приложений и в то же время позволяет использовать команду syncdb
- VSF-проверка (что такое VSF?) - South проверяет, не совершает ли кто-нибудь еще миграцию в конкретном приложении и не приводит ли это к конфликту
Короче, вроде бы действительно то что надо. И хотя версия South всего лишь 0.7.2, однако многие хвалят. Пока альтернативы не особо вижу...