在南迁移中使用聚合器(Min,Max,Avg)

时间:2013-07-18 21:36:55

标签: python django django-south database-migration

我想在迁移中执行annotate / aggregate,因为我需要在修改架构之前准备好数据。 South不允许来自django.db.models的导入聚合器 - 它会在迁移应用程序阶段引发错误。那么南方有没有办法做到这一点?

1 个答案:

答案 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。其余的错误处理和回滚内容非常依赖于您的情况,但我强烈建议您编写回滚以保证安全。