Django优化for循环方法

时间:2013-06-17 17:57:49

标签: python django

我编写了检查一个属性的方法,如果有一个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 ...

3 个答案:

答案 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

只需一个查询