我編寫了一種方法來檢查一個屬性,如果有一個藝術家的銷售= 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
提交
取消
