南迁移和对多对多字段的更改

30 浏览
0 Comments

南迁移和对多对多字段的更改

我正在开发一个应用程序,该应用程序应该向客户发送通讯。我定义了一个模型如下:\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声称没有进行任何更改。我尝试了几次手动操作表和索引,但在某个时候我意识到,既然这是一个新的应用程序,我可以删除所有现有表格,删除所有迁移,并从头开始重新创建初始迁移。然而,这带来了一个问题,如果我真的需要保存数据,该如何进行迁移。

0
0 Comments

问题: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字段。

0