回答

收藏

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

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

说我有一个模型:1 q8 W* v; y- R; L6 E! {( p( ^$ L
Class Person(models.Model):
9 A0 Q5 g- B: K: K$ y* T    firstname = models.CharField()
/ p6 V; P! ?; S    lastname = models.CharField()
6 H( D% S3 V" w$ [% W; B: V- v+ A    birthday = models.DateField()
; K  c2 i7 a9 e4 I% s2 L7 ^) T8 P    # etc...8 d9 M- A- E, V5 a1 o' e
并说我有2个姓氏列表:first_list = ['Bob', 'Rob']我有2个姓氏列表:last_list = ['Williams',
- E& b/ C# Q" N" M'Williamson']。然后,如果我想选择名字在其中的每个人,first_list我可以运行:
( [# y& g* i) w" w0 n: KPerson.objects.filter(firstname__in=first_list)
5 E" V0 O: Q. |, _如果我想选择姓氏在的所有人last_list,我可以这样做:
7 S- s- V9 P  @$ n, B9 ^Person.objects.filter(lastname__in=last_list)
  w2 Q4 ?% c9 C1 \- W  Q$ M到目前为止,一切都很好。如果我想同时运行这两个限制,那很容易…  w9 V+ u' ~1 ~0 Q3 w
Person.objects.filter(firstname__in=first_list, lastname__in=last_list). f  Z) r0 L# r- O' j9 H1 G3 T
如果我想进行or样式搜索而不是and样式搜索,则可以使用Q对象:
# R# F: w9 t8 N  {5 q4 e4 UPerson.objects.filter(Q(firstname__in=first_list) | Q(lastname__in=last_name))$ U3 k6 M- i) x7 H1 I+ o" h5 g
但是我的想法有些微妙。如果我只想返回一个返回名字和姓氏特定组合的查询集怎么办?即我想返回in中的Person对象。也就是说,我想找回叫鲍勃·威廉姆斯或罗伯·威廉姆森的人(但不要叫鲍勃·威廉姆森或罗伯·威廉姆斯的人)。
3 M6 r, M( i$ ?/ ?$ T$ m( F4 v4 |9 g(Person.firstname, Person.lastname)``zip(first_names, last_names): l7 A) m2 O6 }- c+ ]) D% ?/ |
在我的实际使用情况,first_list并last_list就都有?100元。1 N% x& R# u2 g0 }2 ~" t  o
目前,我需要在Django应用中解决此问题。但是我也对在更通用的SQL上下文中处理此问题的最佳方法感到好奇。$ n3 o1 k* l. W) i
谢谢!(并且请让我知道是否可以澄清任何事情。)
! {1 z, }: H! S  S  J1 f                9 Z- W1 }5 h, Q6 p
解决方案:
/ X; N: w9 p8 H0 O# e2 ]                ( |; }) G- ^; a& {( _0 p: c" F& K6 S
! z; `! F# Q# E+ C2 z3 L
. j0 o1 I$ \; |$ p7 v) ]2 k
                除了一个大的OR子句,我看不到很多解决方案:4 g- r+ f0 Y  w
import operator1 t* ]. i' ?  W
from itertools import izip
: u4 [: ?  T6 i$ P" I. N5 Gquery = reduce(; i' M+ h/ h+ J+ H: v& k
    operator.or_, ( v+ t3 @: d7 n/ B
    (Q(firstname=fn, lastname=ln) for fn, ln in izip(first_list, last_list))
) K( F1 V# i1 s0 |! H$ I    )# s6 N$ w' D/ f: \) A
Person.objects.filter(query)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则