南方迁移和变化多到可以场(South migrations and changes to many-

2019-10-17 11:38发布

我工作是应该发送简讯给客户的应用程序。 我有过这样定义的模型

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命令,但南声称,没有任何变化。 我曾几次试图手动操纵表和索引,但在某些时候计算过,因为它是一个新的应用程序,我可以删除所有现有表,删除所有igrations和从头创建初始迁移。 这就提出了一个问题,虽然,我怎么做这样的迁移,如果我真的需要保留的数据。

Answer 1:

如果您需要保存的数据,你需要将它拆分成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”]



文章来源: South migrations and changes to many-to-may fields