django1.7中使用外键

时间:2016-06-20 22:24:08

标签: python mysql django django-migrations

我使用的是django1.7,python 2.7和mysql。我正在编写一些测试来测试我的数据迁移是否正常工作,并且在此过程中要求我的数据迁移是可逆的。

class Migration(migrations.Migration):  

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RunSQL("SET FOREIGN_KEY_CHECKS=0;", reverse_sql="SET FOREIGN_KEY_CHECKS=1;"),
        migrations.RunPython(load_fixture, reverse_code=unload_fixture),
        migrations.RunSQL("SET FOREIGN_KEY_CHECKS=1;", reverse_sql='')
    ]

def unload_fixture(apps, schema_editor):        
        with open(myfile, 'rb') as fixture:
            objects = serializers.deserialize('json', fixture, ignorenonexistent=True)
            for obj in objects:
                obj_name = type(obj.object).__name__
                Model = apps.get_model('myapp', obj_name)
                database_object = Model.objects.get(pk=obj.object.pk)
                if obj.object == database_object: #equality overridden, checks all fields
                    database_object.delete()

class RuleFile(MyAppModel):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=128)
    creator = models.ForeignKey(User, db_column='creator')
    firmware = models.ForeignKey(Firmware)

我需要设置FOREIGN_KEY_CHECKS = 0以便我可以插入我的数据迁移,否则它会在前进时抱怨缺少对外键的引用。现在,当我反向并删除对象时,它会抛出一个DoesNotExist错误,即使我可以在数据库中看到提到的对象,而且是因为外键b / c我仍然可以在python中找到对象,如果我不删除任何外键对象的数量,表示删除对象会影响删除其他对象。我的问题是如何使用外键正确使用Django进行可逆,幂等数据迁移?我的理论是:

转发 - >如果对象尚未存在于数据库中,则添加该对象

反向 - >仅当对象与夹具中的对象匹配时才移除对象,以便将其添加回来

可能的方法 - 使用交易,以便不立即删除条目

0 个答案:

没有答案