南迁移和许多可能领域的变化

时间:2012-12-07 00:30:33

标签: django many-to-many django-south

我正在开发一个应该向客户发送简报的应用程序。我有一个像这样定义的模型

from django.auth.models import User

class Newsletter(models.Model):                                                                  
    owner = models.ForeignKey(User, related_name='+', blank=False)                                                                                                                                                  
    sent = models.BooleanField(default=False)                                                                                                                                                                       
    date_created = models.DateTimeField(auto_now_add=True)                                                                                                                                                          
    date_sent = models.DateTimeField(null=True)                                                                                                                                                                     
    subject = models.CharField(max_length=255)                                                                                                                                                                      
    content = HTMLField()                                                                                                                                                                                           
    recipients = models.ManyToManyField(User, related_name='+')                                                                                                                                                    

后来,我发现我可能需要将这些发送给没有用户帐户的人,所以我定义了一个电子邮件模型

class Email(models.Model):                                                                                                                                                                                          
    email = models.CharField(max_length=255)                                                          

并将收件人字段更改为

recipients = models.ManyToManyField(Email, related_name='+')

在此之后,我运行了schemamigration命令,但South声称没有任何更改。我已经多次尝试手动操作表和索引,但在某些时候认为由于它是一个新的应用程序,我可以删除所有现有的表,删除所有的igrations并从头开始重新创建初始迁移。这提出了一个问题,如果我真的需要保留数据,如何进行这样的迁移。

1 个答案:

答案 0 :(得分:0)

如果您需要保留数据,则需要将其拆分为3次迁移(架构,数据,架构),如下所示:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.add_column(
            u'yourapp_newsletter_recipients',
            'email_id',
            self.gf(
                'django.db.models.fields.related.ForeignKey'
            )(to=orm.Email)
        )

请注意,您应该在迁移的模型属性中使用旧架构。

然后填充电子邮件字段的数据迁移。然后再次进行模式迁移:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.delete_column(u'yourapp_newsletter_recipients', 'user_id')

在这个版本中,您应该已经在迁移模型中为收件人字段设置了正确的m2m字段['newslatter']