南迁移和对多对多字段的更改
南迁移和对多对多字段的更改
我正在开发一个应用程序,该应用程序应该向客户发送通讯。我定义了一个模型如下:\n
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='+')
\n后来,我发现可能需要将这些通讯发送给没有用户账户的人,因此我定义了一个电子邮件模型:\n
class Email(models.Model): email = models.CharField(max_length=255)
\n并将recipients字段更改为:\n
recipients = models.ManyToManyField(Email, related_name='+')
\n之后,我运行了schemamigration命令,但是South声称没有进行任何更改。我尝试了几次手动操作表和索引,但在某个时候我意识到,既然这是一个新的应用程序,我可以删除所有现有表格,删除所有迁移,并从头开始重新创建初始迁移。然而,这带来了一个问题,如果我真的需要保存数据,该如何进行迁移。
问题:South migrations和many-to-many字段的更改
原因:在进行数据库迁移时,如果需要保留数据,需要将迁移拆分为三个部分(模式、数据、模式)。
解决方法:
1. 创建一个包含旧模式的迁移文件,并在迁移的models属性中引用它。
2. 创建一个数据迁移文件,填充email字段。
3. 创建另一个模式迁移文件,删除user_id列,并确保在迁移的models['newsletter']中拥有正确的m2m字段。
示例代码如下:
模式迁移1:
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): # 填充email字段的代码
模式迁移2:
class Migration(SchemaMigration): def forwards(self, orm): db.delete_column(u'yourapp_newsletter_recipients', 'user_id')
以上是解决问题的方法和示例代码。通过将迁移拆分为多个步骤,可以保留数据并更新many-to-many字段。