我编写了一种方法来检查一个属性,如果有一个艺术家的销售= False,则返回False,否则返回True。def check_selling(track, excludes): """ Returns True if all track's artists are allowed for selling. False otherwise """ for artist in track.artists.all(): if not artist.selling: excludes.append(track.pk) return False return True我该如何最小化?我试过:def check_selling(track, excludes): res = excludes.append(track.pk) if not [artist.selling for artist in track.artists.all()] else True return res or False但是[False]或[True]会导致列表理解[track.artists.all()中针对artist.selling的艺术家的销售]始终给出True ...
3 回答

长风秋雁
TA贡献1757条经验 获得超7个赞
进行查询!
def check_selling(track, excludes):
"""
Returns True if all track's artists are allowed for selling. False otherwise
"""
if track.artists.filter(selling=False).exists(): #If "selling" is a boolean
excludes.append(track)
return False
return True
只需一个查询

慕盖茨4494581
TA贡献1850条经验 获得超11个赞
过早的优化是万恶之源-唐纳德·克努斯(Donald Knuth)
...但是,这不是优化的问题。但是做对了。
仅对具有给定属性的记录进行计数,检索所有记录的效率非常低。您可以在SQL级别上做得更好:
SELECT COUNT(*) FROM artist WHERE SELLING != false
该声明将直接返回不出售艺术家的人数。这不仅会减少RDBMS与您的应用程序之间的通信量-而且在某些情况下,RDBMS将能够通过使用索引(如果您对“ selling”有一个索引)和/或其索引来“优化”此语句。缓存。根据您的BD后端,语法可能会有所不同。好消息是Django支持使用进行此类查询。像这样的东西:count()
artist.objects.filter(selling!=false).count()
添加回答
举报
0/150
提交
取消