class PersonFilterSet(filters.FilterSet):
name = filters.CharFilter(field_name='name', lookup_expr="icontains",
help_text='模糊搜索根据人员名称,name=xxx') # icontains 包含,忽略大小写
tag_id = filters.NumberFilter(help_text='标签ID', method='get_query_tag')
class Meta:
model = Person
fields = {
'location_county_id': ['exact'],
'location_city_id': ['exact'],
'location_province_id': ['exact'],
'engineer_level': ['exact'],
}
def get_query_tag(self, queryset, _, value):
if value:
person_ids = PersonToTag.objects.filter(tag_id=value).values_list('person_id', flat=True)
return queryset.filter(id__in=list(person_ids))
return queryset
讲解:
在此filters里边是基于三张表的
人员表Person
标签表Tag
人与标签表的关系PersonToTag
需求:根据tag_id查询到拥有此标签的所有人
首先PersonToTag.objects.filter(tag_id=value),查询关系表中,所有有此标签人的对象,再.values_list(‘person_id’, flat=True)取出来所有的person_id字段,最终queryset.filter(id__in=list(person_ids))筛选出所有的人员对象