【问题标题】:How can I use an OR-condition in a Django ORM filter? [duplicate]如何在 Django ORM 过滤器中使用 OR 条件? [复制]
【发布时间】:2016-05-26 01:48:47
【问题描述】:

这是我的 Django 视图:

    def get_initial_queryset(self):
    filter_dict={}

    location=self.request.POST.get('location_id')
    if location:
        set_if_not_none(filter_dict, 'port__device__host__location', location)
    client=self.request.POST.get('client')   
    if client:
        set_if_not_none(filter_dict, 'client__icontains', client)
    phone=self.request.POST.get('phone')    
    if phone:
        set_if_not_none(filter_dict, 'phone__icontains', phone)
    if line:
        set_if_not_none(filter_dict, 'line__icontains', phone)

    return Client.objects.filter(**filter_dict)

这里我需要用where phone like %phone% or line like %phone%这样的OR条件进行过滤 如何使用过滤器做到这一点?

【问题讨论】:

    标签: django python-3.4 django-orm


    【解决方案1】:

    Complex queries with Q objects。你需要这样写:

    from django.db.models import Q
    Client.objects.filter(Q(phone__icontains=phone) | Q(line__icontains=phone))
    

    你也可以像这样构建 Q 对象:

    filter = Q()
    location = self.request.POST.get('location_id')
    if location:
        filter = filter & Q(port__device__host__location=location)
    client = self.request.POST.get('client')
    if client:
        filter = filter & Q(client__icontains=client)
    phone = self.request.POST.get('phone')
    if phone:
        filter = filter & (Q(phone__icontains=phone) | Q(line__icontains=phone))
    return Client.objects.filter(filter)
    

    【讨论】:

      猜你喜欢
      • 2023-01-24
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2018-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多