2013-08-17 50 views
0

我有这个工作,但我敢肯定,必须有一个更好的方法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) 

感谢

+0

你能粘贴在'models.py'文件中吗? –

回答

0

你应该改变cast_unique是在您使用的剧组成员为重点的字典。这将允许更高的性能,因为您不必迭代迭代器即可。

此外,您使用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) 
+0

谢谢,很明显,你说过使用字典。休息时间! – usermovedhere