__in
- 可以直接理解为当前字段是否在这个集合中
- 例如
rackid = request.POST['rackid']
retdir['rackid'] = rackid
racks = Rack.objects.filter(rackid__icontains = rackid)
equipments = Equipment.objects.filter(rack__in = racks)
可以看出__in等号后面可以直接跟queryset,方便查询,但是这样会极大的影响查询的效率,应为racks会被变成一张子表去执行,它的sql会是如下
select … where id in (select id from …)
所以我们需要优化查询,在__in中尽量使用以经营定义好的数组,你可以这样查
equipments = Equipment.objects.filter(xx__in=list(racks.values_list('id',flat=True)))
这样的话就会去数组中找对应值,它的sql会是如下
select … where id in (1,2,3)
- __in中无法直接匹配字符串查询,你可以通过如下方法查询字符串类型的多值
rackid = request.POST['rackid']
retdir['rackid'] = rackid
racks = Rack.objects.filter(rackid__icontains = rackid)
ids = ",".join(rack.id)
if ids == None or ids == '':
ids = '0'
equipments = Equipment.objects.extra(where=['rack_id IN ('+ ids +')'])