我正在开发一个应该向客户发送简报的应用程序。我有一个像这样定义的模型
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并从头开始重新创建初始迁移。这提出了一个问题,如果我真的需要保留数据,如何进行这样的迁移。
答案 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']