Django查询集过大的时候
今天的一个需求是这样子的,对数据库中存的约100w条数据进行翻译,如果直接遍历下面这个qureyser对象,我们的服务器内存就爆炸了,这时可以选择用迭代器:
qs = Tag.objects.all()
print("这是测试接口!")
for item in qs.iterator():
pass
查询的一个小技巧和一个问题
代码
qs = Tag.objects.filter(chinesestag__isnull=True).nocache()
for item in qs:
try:
tag_chinese_name = translate_google_free(item.name, 'zh-CN', 'en')
except Exception as e:
print(e)
return Response("Translate Fail")
模型类
class Tag(BaseModel):
name = models.CharField(max_length=200)
typeGroup = models.CharField(max_length=100)
type = models.CharField(max_length=100, blank=True, null=True)
permId = models.CharField(max_length=200, blank=True, null=True)
class Meta:
ordering = ("-updatedAt",)
class ChinesesTag(BaseModel):
tag = models.OneToOneField(Tag, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
第一点:在代码中,可以用__isnull属性来查询在tag表中有而在chinesestag表中还不存在的记录。
第二点:这时我本地数据库的情况是tag表中存在的记录已经全部在chinesestag建立了关联记录,所以这时查询集应该是一个空的。单奇怪的是依然会进入for循环并进行遍历,在我请教完同事以后加上了.nocache()方法,原来是缓存的问题。