2010-04-03 72 views
3

假设我有一个定义的模型对象'Person',它有一个名为'Name'的字段。我有一个人名单:我可以使用python列表过滤django模型吗?

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

我想回的所有人员记录一个列表,其中的第一个名字是在1所定义的名称列表。

这样做的最pythonic方式是什么?

编辑:想到它后,我真正想要做的是拿出一个子列表l 不是存在人表中。有没有这样做的有效方式?我可以想到几种方法,但不确定效率如何。

+0

把“高效”,“正确”和“做我所需要的”放在第一位是可以的。这听起来很陈词滥调,但我学习Python越多,似乎是“pythonic”的一个方面。 C的惯例在历史上被认为是“正确的”和“高效的”;由于Python构造不太明显地转换为机器翻译,所以语言一直在改变我优先考虑这两者的方式。 – msw 2010-04-03 05:13:35

回答

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) 

是的,“右侧”的差异(但没有t' - ')接受任何可迭代的(我必须look it up来确认)。

+0

这是正确的方法,但使用'Person.objects.values_list('Name',flat = True')'而不是列表理解来获取名称列表。 – 2010-04-03 09:03:32

+0

@丹尼尔:谢谢,django新手在这里 – msw 2010-04-03 14:23:25

+0

@丹尼尔,不知道我明白。你能重写msw的例子吗? – Rhubarb 2010-04-04 02:46:29

4

这应该工作:

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

相关问题