我能否使用Python列表过滤Django模型?

3
假设我有一个已定义的模型对象“Person”,其中有一个名为“Name”的字段。同时,我还有一个人员列表:
l = ['Bob','Dave','Jane']

我希望返回所有名字不在列表 l 中的人员记录列表。
最符合 Python 风格的方法是什么?
编辑:经过思考,我真正想做的是找到一个子列表,该子列表未出现在 Person 表中。有没有有效的方法来实现这个目标?我可以想到一些方法,但不确定其效率如何。

考虑“高效”是可以的,但“正确性”和“满足我的需求”更为重要。这听起来很老套,但我学习Python的越多,这似乎成为了“Pythonic”的一个方面。在C语言中,通常会同时考虑“正确性”和“高效性”,因为Python构造不太容易转换为机器翻译,所以这种语言正在改变我对这两个方面的优先级。 - msw
2个回答

4
这应该可以正常工作:

3

为了更易读,将 l 重命名:

names = ['Bob','Dave','Jane']

Person.objects.[exclude][1](Name__[in][2]=names)

更新1:回答第二个问题(在您的“编辑”段落中):

present = Person.objects.values_list('Name', flat=True)
absent = set(names) - set(present)   
# or, if you prefer named functions to the set operator '-'
absent = set(names).difference(present) 

是的,差异(但不是“-”)的“右侧”接受任何可迭代对象(我不得不查阅文档以确认)。

这是正确的方法,但使用 Person.objects.values_list('Name', flat=True') 而不是列表推导式来获取名称列表。 - Daniel Roseman
@daniel,不太确定我理解了。你能重新写一下msw的示例行吗? - Rhubarb
@msw,实际上你在使用 flat=True 时根本不需要列表推导式。希望你不介意,我已经自己编辑过了。 - Daniel Roseman
@daniel 不用担心编辑的问题,但是我得到了一个由1个元素组成的列表。现在是时候找出我的错误了,再次感谢。 - msw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接