2013-04-17 7 views
1

Я использую Юг для управления моими базами данных. Кажется, каждый раз, когда я меняю что-то второстепенное в том, как создаются мои модели, мне приходится делать кучу гимнастики для миграции. Например, скажем, у меня есть класс, как это:Миграции схемы и значения по умолчанию

class Entry(models.Model): 

    title = models.CharField(max_length=80) 
    author = models.ForeignKey(User) 
    pubDate = models.DateTimeField() 
    tags = models.ManyToManyField(Tag) 
    text = models.TextField() 

и еще один класс, который имеет Entry как ForeignKey:

class Comment(models.Model): 
    author = models.ForeignKey(User) 
    entry = models.ForeignKey(Entry) 
    pubDate = models.DateTimeField() 
    text = models.TextField() 

Это тривиально, но если бы я сделать что-то же просто, как изменить название PubDate к pub_date в Entry для того, чтобы должным образом выполнить миграцию схемы только для этого изменения имени, я должен был бы установить:

default=None, null=True 

как для PubDate в Entry И на entry поле в Comment, в противном случае я бы получаю следующее исключение при попытке запустить миграцию:

The field 'Comment.entry' does not have a default specified, yet is NOT NULL. 

ТОГДА я должен вернуться и принять нулевые значения по умолчанию /. Есть ли менее утомительный способ сделать это, или мне просто нужно ДЕЙСТВИТЕЛЬНО придумать свои модели, прежде чем переносить их на миграцию? На начальных этапах, имеет ли смысл создавать и разрывать базу данных, если у вас нет данных, которые вы хотите сохранить? Если да, то какой самый простой способ сделать это?

ответ

0

вам нужно создать класс миграции, с помощью:

python manage.py datamigration yourapp change_name_to_pub_date 

и перепишем вперед и назад методы:

# -*- coding: utf-8 -*- 
import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 


class Migration(SchemaMigration): 
    def forwards(self, orm): 
     db.rename_column('yourapp_entry', 'pubDate', 'pub_date') 
     db.rename_column('yourapp_comment', 'pubDate', 'pub_date') 

    def backwards(self, orm): 
     db.rename_column('yourapp_entry', 'pub_date', 'pubDate') 
     db.rename_column('yourapp_comment', 'pub_date', 'pubDate') 

и теперь запустите:

python manage.py migrate yourapp 
Смежные вопросы