Python 交易管理错误“;事务管理块以挂起的提交/回滚“结束;在Django进行迁移时

Python 交易管理错误“;事务管理块以挂起的提交/回滚“结束;在Django进行迁移时,python,django,migration,django-south,Python,Django,Migration,Django South,当我使用python manage.py migrate manage进行迁移时(是的,它是Django 1.8,我无法更改它:/),迁移(我测试的每个迁移)总是失败,并出现相同的错误: django.db.transaction.TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK 以下是迁移文件中的代码: 类迁移(模式迁移): def转发(自身、orm): #检查组

当我使用
python manage.py migrate manage
进行迁移时(是的,它是Django 1.8,我无法更改它:/),迁移(我测试的每个迁移)总是失败,并出现相同的错误:

django.db.transaction.TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

以下是迁移文件中的代码:

类迁移(模式迁移):
def转发(自身、orm):
#检查组织中的过期密钥
对于Organization.objects.all()中的组织:
self.checkExpiryDate(组织)
#检查UserProfileRoleInOrganization中的过期密钥
对于UserProfileRoleInOrganization.objects.all()中的uprio:
自我检查到期日(uprio)
def checkExpiryDate(自身、实体):
#检查有效期是否与apikey一致,必要时进行修正
如果不是entity.date\u已更改:
返回
_key=entity.getExpiryDateInKey()中的日期
如果不在按键中输入日期:
返回
y=int(日期输入键[:4])
m=int(键[4:-2]中的日期)
d=int(日期输入键[-2:])
entity.expiration\u date=datetime.datetime(y,m,d)
entity.save()
def向后(自身,orm):
通过
我已经看到了其他类似问题的一些答案,但没有,我没有任何@commit。。。。我的代码中的装饰器


有人能帮我吗?

在数据迁移中,您应该避免直接导入模型,因为“实际”模型可能与以前的迁移不一致

因此,例如,使用:

# We can't import the Person model directly as it may be a newer
# version than this migration expects. We use the historical version.
Person = apps.get_model('yourappname', 'Person')
而不是

from yourappname.models import Person
见:

这至少与Django的最新版本有关;我不记得怎么对付南方

您还可以尝试将此选项添加到数据库['default']定义中:

'OPTIONS': {'autocommit': True,}

因为在Django 1.8中,自动提交的默认值为False(可能);有时,这有助于接收正确的数据库异常。

删除迁移文件夹并重新运行迁移 ./manage.py makemigrations应用程序 ./manage.py迁移


您还可以伪造迁移并重置它

什么是
SchemaMigration
?您如何声明数据迁移中声明的组织和UserProfileRoleInOrganization?@nima这是South.v2中的South模型,但我检查过了,它是BaseMiggration中的,但几乎不是empty@MarioOrlandi我只做了两个“进口”声明,如果这是你想要的。我知道他们工作得很好,我会给出一个正确的答案,以提供一些格式;)你好,谢谢你的回答。现在,我将使用正确的方法导入数据迁移模型。我相信你告诉我的是Django的最新版本,但是我测试了选项和导入,没有一个帮助我在Django 1.8上获得更好的结果。但是谢谢你的帮助,现在,你会得到赏金:)你好@Arlien,根本无意强迫你使用Django的更新版本:我知道有时候这是不可行的;)我只是想澄清一下,我的建议可能需要一些修改。非常感谢,我做了第一件事,但它不起作用,但后来我伪造了它们,它对我有点起作用。我不认为这是解决这个问题的正确方法,但它有助于绕过它。谢谢你,先生。