我有以下Django模型:
class Profile(models.Model):
idNum = models.charField(max_length=10, unique=True)
active = models.BooleanField(default=False)
idType = models.charField(max_length=10)
我有两个列表:idNums
和idTypes
(长度相同):
idNums = ['1', '3', '5', '7', ...]
idTypes = ['1', '1', '0', '2', '2', ...]
我想根据Profile
过滤idNums
,并使用idTypes
设置相应的字段值。
显而易见的方法是:
for idNum, idTypes in zip(idNums, idTypes):
profile = Profile.objects.get(idNum=idNum)
profile.active = True
profile.idType = idType
profile.save()
这样好吗?我的意思是,如果要处理数千个配置文件实例,是否需要很长时间?
有更快的方法吗?我能想到的是,例如,首先获取实例列表:
profiles = Profile.objects.filter(idNum__in=idNums)
然后是什么?
答案 0 :(得分:1)
当然,您可以使用select
而不是单个filter
来减少sql get
查询的数量,但我相信您最好使用{{1} }。但您仍需要进行单独的in_bulk
来电:
save
但是,如果您可以在idNum上想到idType的原始函数依赖关系,或者如果您可以从数据库中的其他源检索它,则可以将F expressions
与{{3}结合使用}}:
# This will give you a dictionary like {profile_id: Profile, ...}
profile_dict = Profiles.objects.in_bulk(idNums)
for idNum, idTypes in zip(idNums, idTypes):
profile = profile_dict[idNum]
profile.active = True
profile.idType = idType
profile.save()