我想执行annotate
/ aggregate
inside 迁移,因为我的数据需要在模式修改之前准备好。South 不允许进口聚合器来回django.db.models
- 它在迁移应用程序阶段引发错误。那么在南方有没有办法做到这一点?
问问题
179 次
1 回答
0
这是一种最坏的情况,但一种选择是让 South 直接为您执行 SQL。
从他们的文档:https ://south.readthedocs.org/en/latest/databaseapi.html#db-execute
获取 SQL 查询有时会很痛苦,但您可以让 Django 从您的Model.objects.filter().blahblah.blah
语句中将其提供给您
公平警告
直接使用这样的查询对象是不好的,所以请不要在部署的代码中这样做。在这种情况下,虽然由于.aggregate()
不返回 QuerySet,但实际查询有点困难。话虽如此,要从您的查询中获取 SQL(假设隔离整个事情有点容易),您可以启动 adjango-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
. 其余的错误处理和回滚内容在很大程度上取决于您的情况,但为了安全起见,我强烈建议编写回滚。
于 2013-08-21T17:42:15.403 回答