我想在迁移中执行annotate
/ aggregate
,因为我需要在修改架构之前准备好数据。 South不允许来自django.db.models
的导入聚合器 - 它会在迁移应用程序阶段引发错误。那么南方有没有办法做到这一点?
答案 0 :(得分:0)
这是一种最糟糕的情况,但一种选择是让South直接为你执行SQL。
来自他们的文档:https://south.readthedocs.org/en/latest/databaseapi.html#db-execute
获取SQL查询有时会很麻烦,但是你可以让Django从你的Model.objects.filter().blahblah.blah
语句中将它提供给你
直接搞乱这样的查询对象是不好的,所以请不要在部署的代码中这样做。在这种情况下,虽然.aggregate()
不返回QuerySet,但实际查询有点困难。话虽如此,要从您的查询中获取SQL(假设分离整个事情有点容易),您可以启动django-admin.py shell
并执行类似
from django.db.models import Count
import MyModel
q = MyModel.objects.all().query
q.add_aggregate(Count('pk'), MyModel, 'name', is_summary=True)
print q
.annotate()
会直接返回一个查询集,因此您无需查看.add_aggregate()
。
from django.db.models import Count
import MyModel
print (MyModel.objects.all()
.annotate(c = Count('some_field'))
.query)
从那里你几乎将SQL剪切成一个字符串以便进行数据迁移,然后调用db.execute
。其余的错误处理和回滚内容非常依赖于您的情况,但我强烈建议您编写回滚以保证安全。