Django | Adding a field to an existing Django model

Nov 11, 2010 11:08

У меня возникла новая острая проблема - как добавить дополнительное поле в существующую модель? Один раз я уже сталкивался с такой ситуацией, так и не нашел решение и в результате вынужден был удалить базу данных 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, однако многие хвалят. Пока альтернативы не особо вижу...

django

Previous post Next post
Up