2012-12-07 73 views
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並從頭開始重新創建初始遷移。然而,這提出了一個問題,如果我真的需要保存數據,我該如何做這樣的遷移。

+0

南有沒有注意到新的'Email'模式? – ptrck

+0

是的,它的確如此。但它沒有注意到有關M2M鏈路的任何信息。 –

+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」]