猿问

Django优化方法中的循环

我编写了一种方法来检查一个属性,如果有一个艺术家的销售= 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 ...


慕妹3146593
浏览 192回答 3
3回答

长风秋雁

进行查询!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

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

相关分类

Python
我要回答