如何通过multi-params过滤query_set?
class UserListAPIView(ListAPIView):
"""
return the user list
"""
pagination_class = UserPageNumberPagination
class Meta:
ordering = ['-id']
def get_serializer_class(self):
return UserListSerializer
def get_queryset(self):
username = self.request.query_params.get("username")
real_name = self.request.query_params.get("real_name")
phone = self.request.query_params.get("phone")
company_name = self.request.query_params.get("company_name")
return User.objects.filter(
is_admin=False,
is_staff=False,
is_superuser=False,
username=username,
real_name=real_name,
phone=phone,
company_name=company_name
) # if `username, real_name, phone, company_name` all are None, there gets `[]`
序列化器:
class UserListSerializer(ModelSerializer):
"""
user list serializer
"""
username = serializers.CharField(allow_null=True, allow_blank=True)
real_name = serializers.CharField(allow_null=True, allow_blank=True)
phone = serializers.CharField(allow_null=True, allow_blank=True)
company_name = serializers.CharField(allow_null=True, allow_blank=True)
您知道,username , real_name, phone, company_name
所有人都是allow_null
。
我想查询符合条件的所有用户。
但是当我没有通过[]
时,获取username, real_name, phone, company_name
。
我想如果username
为无,则不会过滤username
,如果real_name
为无,则不会过滤real_name
。 (我的意思是它不会过滤掉它)
我有一个想法,但如果只有一个username
字段,它适用于较少的字段:
def get_queryset(self):
username = self.request.query_params.get("username")
if username == None or username == '':
return User.objects.filter(
is_admin=False,
is_staff=False,
is_superuser=False)
else:
return User.objects.filter(
is_admin=False,
is_staff=False,
is_superuser=False,
username=username)
但是有很多领域,我不能写出所有判断条件。 我试过用
return User.objects.filter(
is_admin=False,
is_staff=False,
is_superuser=False,
username__contains=username,
real_name__contains=real_name,
phone__contains=phone,
company_name__contains=company_name
)
但是也不要工作。
有没有一种很好的方法来实现这一要求?
答案 0 :(得分:2)
您可以创建一个dict,然后使用关键字扩展来传递它。
driver=webdriver.Firefox()
driver.maximize_window()
driver.get("https://www.google.com")
driver.execute_script("window.open('https://www.google.com','new window')")
driver.switch_to_window(driver.window_handles[1])
time.sleep(4)
driver.execute_script("window.open('https://www.google.com','new window')")
driver.switch_to_window(driver.window_handles[2])
time.sleep(4)
driver.execute_script("window.open('https://www.google.com','new window')")
driver.switch_to_window(driver.window_handles[3])
time.sleep(4)
river.execute_script("window.open('https://www.google.com','new window')")
如果有分页参数,可以用以下内容排除:
filters = {'{}__contains'.format(key): value
for key, value in query_params.items()
if value is not None}
return User.objects.filter(**filters)
答案 1 :(得分:-1)
我希望这就是你要找的东西。
from django.db.models import Q
obj_list = User.objects.filter(
is_admin=False,
is_staff=False,
is_superuser=False,
Q(username__contains=username)|
Q(real_name__contains=real_name)|
Q(phone__contains=phone) |
Q(company_name__contains=company_name)
)
return obj_list
让我知道这是否适合您。