1

我正在开发一个应该向客户发送新闻通讯的应用程序。我有一个这样定义的模型

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 并从头开始重新创建初始迁移。不过,这提出了一个问题,如果我真的需要保留数据,我该如何进行这样的迁移。

4

1 回答 1

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']

于 2013-09-26T09:37:58.290 回答