在schemamigration之后,外键返回不存在

时间:2014-11-17 22:04:51

标签: django django-models django-south

当我第一次开始使用Django时,我愚蠢地创建了一个模型(让我们称之为Foo)并明确地给它一个id字段,不知道django是否自动添加了它。我还有一个模型(让我们称之为Bar)与该模型的外键。我想更新内容并删除这个foo_id字段,所以我将其删除,在南方运行模式迁移并运行更改。我现在遇到的问题是我的Bar模型在我尝试从DoesNotExist: Foo matching query does not exist.调用foo时错误{/ 1}}

如果我查看该对象,则会有foofoo_id的属性。 foo_id会返回一个ID,但当我尝试调用foo时,95%的人会返回错误。

class Foo(models.Model):
    foo_id = models.IntegerField(primary_key=True)

class Bar(models.Model)
    foo = models.ForeignKey(Foo)

schemamigration

class Migration(SchemaMigration):                                                                          

    def forwards(self, orm):                                                                               
        # Deleting field 'Foo.foo_id'                                                                  
        db.delete_column(u'foo', 'foo_id')                                                             

        # Adding field 'Foo.id'                                                                          
        db.add_column(u'foo', 'id',                                                                      
                      self.gf('django.db.models.fields.AutoField')(default=None, primary_key=True),        
                      keep_default=False)                                                                  

1 个答案:

答案 0 :(得分:0)

需要做的是迁移文件中的数据转换,这需要一些自定义

class Migration(SchemaMigration):                                                                          

    def forwards(self, orm):
        # Adding field 'Foo.id'                                                                          
        db.add_column(u'foo', 'id',                                                                      
                      self.gf('django.db.models.fields.AutoField')(default=None),        
                      keep_default=False)

        for bar in Bar.objects.all():
            bar.foo_id = bar.foo.id
            bar.save()

        # Deleting field 'Foo.foo_id'                                                                  
        db.delete_column(u'foo', 'foo_id')

        db.create_primary_key('food', 'id')                                                             

它真的未经测试,但可能接近所需。