2

我编写了一个方法来检查一个属性,如果有一个艺术家的 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.sales for artist in track.artists.all()] 总是给出 True...

4

3 回答 3

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
于 2013-06-17T18:02:45.240 回答
2

过早的优化是万恶之源——Donald Knuth

...但是,这里没有优化问题。但是做对了。

检索所有记录只是为了计算具有给定属性的记录是非常低效的。您可以在 SQL 级别做得更好:

SELECT COUNT(*) FROM artist WHERE SELLING != false

该声明将直接返回销售的艺术家数量。这不仅会减少 RDBMS 和您的应用程序之间的流量——而且在某些情况下,RDBMS 将能够通过使用索引(如果您有一个关于“销售”的索引)和/或其缓存。根据您的 BD 后端,语法可能会有所不同。好消息是 Django 支持使用. 像这样的东西:count()

artist.objects.filter(selling!=false).count()
于 2013-06-17T18:09:40.453 回答
2

进行查询!看这里

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

只需一个查询

于 2013-06-17T18:12:58.123 回答