django 条件过滤 queryset.filter用法和 django_filters.FilterSet用法

1 queryset.filter用法

__exact 精确等于 like 'aaa'
 __iexact 精确等于 忽略大小写 ilike 'aaa'
 __contains 包含 like '%aaa%'
 __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False

如果参数是字典,如

condtions: {'date__lt': '2018-05-22','status': '未支付','name__exact': 'yangxia'}

 Entry.objects.filter(**condtions)相当于 Entry.objects.filter(date__lt= '2018-05-22',status='未支付',name__exact='yangxia')

翻译成sql语句是

select * from  Entry.objects where date<='2018-05-22' and status='未支付' and name like 'yangxia'


filter例子:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2= q1.filter(pub_date__gte=datetime.date.today())
>>> q3= q.filter(pub_date__lte=datetime.date.today())

 

2 django_filters.FilterSet用法

from django_filters import rest_framework as django_filters
class RobotFilter(django_filters.FilterSet):
   robot_id = django_filters.CharFilter(field_name='id')
   machine_id = django_filters.CharFilter(field_name='machine_id')
   city = django_filters.CharFilter(field_name='city')
   # lookup_expr(可选)为判断条件,field_name(必选)为模型类属性,created_time查询字符串
   created_time = django_filters.CharFilter(field_name='created_at', lookup_expr='startswith')
   created_start_time = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='gt')
   created_end_time = django_filters.DateTimeFilter(field_name='created_at', lookup_expr='lt')
   problem_isnull = django_filters.BooleanFilter(field_name='problem', lookup_expr='isnull')
   name = django_filters.CharFilter(lookup_expr='iexact')  # iexact表示精确匹配, 并且忽略大小写
   author = django_filters.CharFilter(lookup_expr='icontains')  # icontains表示模糊查询(包含),并且忽略大小写
   price = django_filters.NumberFilter(look_expr='exact')  # exact表示精确匹配
   age_g = filters.NumberFilter(field_name='age', lookup_expr='gte',help_text="年龄大等于")
   age_l = filters.NumberFilter(field_name='age', lookup_expr='lte',help_text="年龄小等于")
   # opensea是一个外键
   town = filters.CharFilter(field_name='opensea__home_town',lookup_expr='icontains',help_text="户籍地")
   exp = filters.CharFilter(method='get_exp_work_display',help_text="职位匹配")
   def get_exp_work_display(self, queryset, *arg):
       word = arg[1]
       # MySeaMid.objects.filter(user=self.request.user, sea_type=0).order_by('-add_time')
       queryset = queryset.filter(Q(opensea__worker__icontains=word) | Q(opensea__job_exp__icontains=word))
       return queryset
   task_res_state = django_filters.CharFilter(method="get_task_res_state")

   def get_task_res_state(self, queryset, *arg): #多选情况
      if str(arg[1]) == "0":  # arg[1]=('task_res_state', '0')
         task_res = (1, 2, 3)
      else:
         task_res = (0, 4, 5, 6)
      print(task_res)
      queryset = queryset.filter(task_res__in=task_res)
      return queryset

   class Meta:
      model = Robot
      fields = ['robot_id', 'machine_id', "city", "created_start_time", "created_end_time", 'created_time',
              'firmware_version', 'state', "robot_type", "hardware_version", "exist_map", 'task_res_state']

你可能感兴趣的:(数据库,django,python,django)