我编写了检查一个属性的方法,如果有一个sell = 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]导致列表理解[artist.artists.all()中艺术家的artist.selling总是给出True ...
答案 0 :(得分:2)
http://docs.python.org/2/library/functions.html#all
版本2.5中的新内容。
def check_selling(track, excludes):
"""
Returns True if all track's artists are allowed for selling. False otherwise
"""
if all( [artist.selling for artist in track.artists.all()] ):
return True
excludes.append(track.pk)
return False
答案 1 :(得分:2)
过早优化是所有邪恶的根源 - Donald Knuth
...但是,这里不存在优化的问题。但做得对。
检索所有记录以计算具有给定属性的记录是非常低效的。你可以在SQL级别做得更好:
SELECT COUNT(*) FROM artist WHERE SELLING != false
该声明将直接返回艺术家不销售的数字。这不仅会减少RDBMS与您的应用程序之间的流量 - 但在某些情况下,RDBMS将能够“优化”此语句,方法是使用索引(如果您有一个“卖”)和/或缓存。根据您的BD后端,语法可能会有所不同。好消息是Django使用count()
支持此类查询。这样的事情:
artist.objects.filter(selling!=false).count()
答案 2 :(得分:2)
进行查询! 见Here
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
只需一个查询