【问题标题】:Using aggregators (Min, Max, Avg) inside South migrations在 South 迁移中使用聚合器(Min、Max、Avg)
【发布时间】:2013-07-18 01:09:21
【问题描述】:

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

【问题讨论】:

标签: python django django-south database-migration


【解决方案1】:

这是一种最坏的情况,但一种选择是让 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。其余的错误处理和回滚内容在很大程度上取决于您的情况,但为了安全起见,我强烈建议您编写回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2016-11-05
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多