回答

收藏

Django过滤器对多列值的“组合”查询集

技术问答 技术问答 419 人阅读 | 0 人回复 | 2023-09-14

说我有一个模型:4 [4 E8 X3 P' c- e2 ~- I
Class Person(models.Model):
- B. [/ {/ }8 K% ^0 n& T    firstname = models.CharField()
* J: Z" Q; O+ T/ W/ {; U2 b) X* A    lastname = models.CharField()
! M  v: u. o0 o! c    birthday = models.DateField()& B6 M" l: n  [/ s9 _
    # etc...
& U7 I! p; X2 N* C3 \, p并说我有2个姓氏列表:first_list = ['Bob', 'Rob']我有2个姓氏列表:last_list = ['Williams',0 R$ I6 L) F2 t1 y& _
'Williamson']。然后,如果我想选择名字在其中的每个人,first_list我可以运行:
" `6 u' o; t1 n* SPerson.objects.filter(firstname__in=first_list)/ c/ A2 U; f$ \0 b. T$ O- R
如果我想选择姓氏在的所有人last_list,我可以这样做:
' b" _' N3 U# M( {Person.objects.filter(lastname__in=last_list)
* H# d+ D* P' W9 T" [% x到目前为止,一切都很好。如果我想同时运行这两个限制,那很容易…
9 y  W2 Y! i' I- J  ^( U1 TPerson.objects.filter(firstname__in=first_list, lastname__in=last_list)3 r6 X2 n* s( o
如果我想进行or样式搜索而不是and样式搜索,则可以使用Q对象:* Z% o+ c- r, N8 m2 z: ^, b8 k9 ~
Person.objects.filter(Q(firstname__in=first_list) | Q(lastname__in=last_name))' Q: F9 K! k9 n4 \% m$ f9 {9 ~
但是我的想法有些微妙。如果我只想返回一个返回名字和姓氏特定组合的查询集怎么办?即我想返回in中的Person对象。也就是说,我想找回叫鲍勃·威廉姆斯或罗伯·威廉姆森的人(但不要叫鲍勃·威廉姆森或罗伯·威廉姆斯的人)。
- h1 \; I- V% _" M(Person.firstname, Person.lastname)``zip(first_names, last_names)2 y9 L( z0 m7 ~5 Z- z
在我的实际使用情况,first_list并last_list就都有?100元。& l6 K: n6 C+ p1 d) m% M# w
目前,我需要在Django应用中解决此问题。但是我也对在更通用的SQL上下文中处理此问题的最佳方法感到好奇。: e, e0 J" n$ J" m, B! j6 H
谢谢!(并且请让我知道是否可以澄清任何事情。)
% W# u/ J' y" ^9 {/ X2 ~+ V& ]                + O, I; m1 v1 f
解决方案:* |' K; @& R! U8 G
                * K% M- R: r! x

. s( ?8 A2 f/ @
# @; w8 {6 |# P% F+ k! W                除了一个大的OR子句,我看不到很多解决方案:1 K% X: W+ X- {9 B. |
import operator
% v' u" W1 `' \1 ~8 Lfrom itertools import izip( _* f5 k7 `) G* k% n9 {6 p
query = reduce(. ], @7 O, s: b# O& T7 D
    operator.or_, 6 B( u7 ?- X- |* z6 j
    (Q(firstname=fn, lastname=ln) for fn, ln in izip(first_list, last_list))0 E( L  U0 G$ f. p* h( D
    )
) X+ y4 y7 z+ t0 Y9 a/ rPerson.objects.filter(query)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则