做web开发不仅仅只是考虑逻辑的实现,还要考虑效率、方法之类的。
比如随机获取相关的五篇文章这样的一个简单功能。
我早期是用的post.objects.all(),从数据库中获取全部文章,然后再用random.choice()方法从所有的文章中随机选出五篇,这样的方式看着没什么问题,也可以实现相应的功能,但是在真正使用的时候,就会出现大问题。
什么大问题?
就是在数据量比较大的时候,比如10万甚至100万数据库的时候,如果先post.objects.all()获取全部文章再来选五篇,不仅数据库查询慢,而且在做判断的时候占用大量的内存,导致网站卡顿甚至打不开。
今天优化了一下,按下面这种方式来写:
def related(postid): related_post = [] post = Posts.objects.get(id=postid) catename = post.catename count = Posts.objects.filter(catename=catename).count() if count > 5: i = 0 while i < 5: i += 1 postid=random.randint(1,count) k1 =Posts.objects.filter(id=postid).exists() if k1: k1=Posts.objects.get(id=postid) related_post.append(k1) return list(set(related_post))#去除重复 else: return Posts.objects.filter(catename=catename)
这段代码的意思是什么?
不是要随机五篇文章吗?
我先随机生成五个数,然后,再到数据库中按id获取五篇文章,我们只要挨个判定对应id是否存在就就行了。这样子也是随机获取五篇文章,最多也就查询数据10次左右。显然,使用这个方式,数据库的读取量就大大大大地减少了啦。
如果你有更好的办法,欢迎指教。
标签: