我有一个名为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()
我想知道是否有办法以更有效的方式做到这一点(以某种方式批量更新?)
技术信息:
答案 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 queries和update 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;"),