【问题标题】:Django filter, many queries in arrayDjango过滤器,数组中的许多查询
【发布时间】:2022-01-14 18:15:24
【问题描述】:

需要一个添加 Q() 对象的数组 具有多个值的过滤器

Anime.objects.filter(Q(question__startswith='Who') & Q(question__startswith='What'))

但需要这样的东西

val_arr = []
val_arr.append(Q(question__startswith='Who'))
val_arr.append(Q(question__startswith='What'))
Anime.objects.filter(val_arr)

【问题讨论】:

  • 您能否详细说明。你的问题不清楚。

标签: python django django-views


【解决方案1】:

你可以用这样的字典来做:

filters = Q()

val_arr = dict()
val_arr.update({"question__startswith": 'Who'))
val_arr.update({"question__startswith": 'What'))

for item in val_arr:
   filters |= Q(**{item:val_arr[item]})

Anime.objects.filter(filters)

【讨论】:

  • 你是如何声明过滤器变量的。分配前引用的局部变量“过滤器”
  • 更新了答案检查
【解决方案2】:

而不是& (AND) 操作,使用| (OR) 将解决您的问题

所以改变

Anime.objects.filter(
    Q(question__startswith='Who') & Q(question__startswith='What')
)

Anime.objects.filter(
    Q(question__startswith='Who') | Q(question__startswith='What')
)

【讨论】:

    【解决方案3】:

    调查著名的django-filters 包。它可能已经完成了您想做的所有事情,允许用户在视图中构建自己的复杂查询。

    可以使用| 或运算符对您提出的问题进行编码

    q = val_arr[0]
    for val in val_arr[1:] :
        q = q | val
    
    Anime.objects.filter( q)
    

    你需要|你的Q对象在一起。同一个问题不能同时以“谁”和“什么”开头。 qs.filter(field1=val1, field2=val2) 是和逻辑,你也可以通过 Q(field1=val1)&Q(field2=val2) 来这样做

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多