使用列表过滤模型,然后使用另一个列表设置另一个字段

时间:2016-12-01 15:28:57

标签: django django-models

我有以下Django模型:

class Profile(models.Model):
    idNum = models.charField(max_length=10, unique=True)
    active = models.BooleanField(default=False)
    idType = models.charField(max_length=10)

我有两个列表:idNumsidTypes(长度相同):

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)

然后是什么?

1 个答案:

答案 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()