为了账号安全,请及时绑定邮箱和手机立即绑定

Django优化方法中的循环

Django优化方法中的循环

慕妹3146593 2021-03-29 15:07:47
我编写了一种方法来检查一个属性,如果有一个艺术家的销售= 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

只需一个查询


查看完整回答
反对 回复 2021-04-02
?
慕盖茨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()


查看完整回答
反对 回复 2021-04-02
  • 3 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号