【问题标题】:Django query filter with contains and empty list variable带有包含和空列表变量的 Django 查询过滤器
【发布时间】:2020-11-18 13:19:57
【问题描述】:

matched = Details.objects.filter(Q(cnp=cnp) | Q(phones__contains=[phone]) | Q(emails__contains=[email])).values('id')

class Details(models.Model):

    ...
    cnp = models.CharField(max_length=24, blank=True)
    phones = ArrayField(models.CharField(max_length=50), size=20, blank=True, default=list)
    emails = ArrayField(models.EmailField(), size=20, blank=True, default=list)

你好!

我想进行查询,如果任何字段(cnp、电话或电子邮件)匹配以获取结果查询集。 cnp、电话和电子邮件变量将只获得一个值,我需要将其与 ArrayField 中的一个或多个值进行匹配。 我使用 Q 进行了上面的查询,但问题是我可以为电话或电子邮件变量提供空列表/字符串,然后匹配我的所有数据库。 如果我不使用 'contains',我可以匹配单值列表(来自 db ArrayField),但例如,如果我在 db 中有多个电子邮件,我需要将它与 'contains' 匹配以获得结果。 这是否可能仅来自 django 查询? 谢谢!

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    像其他支持使用 | 位运算符 Django Q 对象的对象一样,我们也可以使用 |= 赋值,这在这种情况下可能会有所帮助。

    queries = Q(cnp=cnp)
    
    if phone:
        queries |= Q(phones__contains=[phone])
    if email:
        queries |= Q(emails__contains=[email])
    
    matched = Details.objects.filter(queries)
    

    这应该允许您对phoneemail 执行检查,并且如果它们被批准,则仅将这些值包含在传递给查询集的 Q 对象中。

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 2019-08-15
      • 2017-06-03
      • 2011-09-17
      • 2016-04-03
      • 1970-01-01
      相关资源
      最近更新 更多