根据计数更新模型中的字段"多对多"领域

时间:2015-07-17 08:53:28

标签: python django django-models migration

我有一个名为Friend的django模型,它通过另一个名为friends的模型包含多个名为FriendshipInfo的字段。出于性能原因,我决定举办一个场地,其中包含每个人拥有的朋友数量。所以现在在迁移脚本中我需要更新我的数据库中的现有朋友。这就是我做到的:

def forward(...):
    # ... adding the new count field ...
    for person in Friend.objects.all():
        person.friends_count = len(persion.friends.all())
        person.uupdate()

我想知道是否有办法以更有效的方式做到这一点(以某种方式批量更新?)
技术信息:

  1. 我使用的是Python 2.7
  2. 我正在使用django 1.6
  3. 对于迁移我使用南

2 个答案:

答案 0 :(得分:1)

我很想使用extra查询集方法获取朋友数量并批量更新Friend个对象,例如:

def forward(...):
    # adding the new count field
    Friend.objects.extra(select = {
        'friends_number': 'SELECT COUNT(*) FROM <your_many_to_many_table_name> WHERE <your_many_to_many_table_name>.<your_FriendshipInfo_related_name> = <your_Friend_table_name>.id'
    }).update(friends_count=F('friends_number'))

但是,by the look of things,这是不可能的。但是,您可以使用{s> raw方法 custom SQL queriesupdate from count query

from django.db import connection

def forward(...):
    # adding the new count field
    cursor = connection.cursor()
    cursor.execute('\
        UPDATE <your_Friend_table_name>\
        SET friends_count = \
        (SELECT COUNT(*) FROM <your_many_to_many_table_name> WHERE <your_many_to_many_table_name>.<your_FriendshipInfo_related_name> = <your_Friend_table_name>.id)')

答案 1 :(得分:0)

它在迁移文件中的正确方式进行数据迁移(.py) 你可以在没有问题的情况下放置sql查询,方法是migrations.RUNSQL 这是一个例子:

类迁移(migrations.Migration):

dependencies = [
    ('procesos', '0020_auto_20150703_1656'),
]

operations = [
    migrations.RunSQL("UPDATE procesos_busquedainmueble SET tipo_inmueble_id=(filtros::json->>'tipo_inmueble')::int;"),