Django,按字段过滤和分组查询结果

时间:2013-08-17 20:24:14

标签: python django

我有这个工作,但我确信必须有一个更好的方法

上下文是一个电影/电视应用程序,所以有标题(电影/电视)和每个,多对多关系中的人。

我有一个“titlepeople”模型,其中包含以下信息:

id, people_fk, title_fk, role_title

在演员有很多角色的电影中,我需要显示他们的信息,如: 汤姆汉克斯:园丁,警察#1,另一个角色#4

无论如何,我可以优化以下的方式,这样代码就不那么冗长了吗?

cast_unique = list()
for person in cast:
    #if not in the unique list, add them
    if person.people not in [p.people for p in cast_unique]:
        cast_unique.append(person)
    else:
        # if in the list, append the role information
        if person.role_title:
            for c in cast_unique:
                if c.people == person.people:
                    # append role info
                    c.role_title = '{0} / {1}'.format(c.role_title, person.role_title)

由于

1 个答案:

答案 0 :(得分:0)

您应该将cast_unique更改为使用演员作为键的字典。这将允许更高的性能,因为您不必迭代cast_unique iterable。

此外,您在if person.people not in [p.people for p in cast_unique]:中使用列表推导需要为测试的每次迭代创建一个完整的列表;哪个,可以使用大量的内存加上当匹配发生时没有办法短路列表理解。在这种情况下,字典仍然是一种更好的数据类型。

cast_unique = {}
for person in cast:
    if person.people not in cast_unique:
        cast_unique[person.people] = person
    else:
        cast_unique[person.people].role_title = '{0} / {1}'.format(cast_unique[person.people].role_title, person.role_title)