我可以用Python列表过滤Django模型吗?

3 投票
2 回答
1122 浏览
提问于 2025-04-15 21:11

假设我有一个叫做“Person”的模型对象,这个对象里有一个字段叫“Name”。然后我有一个人名的列表:

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

我想要找出所有“Person”记录中,名字不在这个列表l里的记录。

用Python最好的方法是什么呢?

补充说明:经过思考,我其实想要的是从列表l中找出那些不在“Person”表里的名字。有没有什么高效的方法可以做到这一点?我能想到几种方法,但不太确定哪种更有效。

2 个回答

4

这个代码应该可以正常工作:

Person.objects.exclude(name__in=['Bob','Dave','Jane'])

意思是从“Person”这个对象中排除掉名字是“Bob”、“Dave”和“Jane”的人。

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) 

是的,差异的“右边”部分(但不是'-')可以接受任何可迭代的对象(我查了一下文档来确认这一点)。

撰写回答