如何通过multi-params过滤query_set?

时间:2018-01-23 10:01:23

标签: python django django-queryset

如何通过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
            ) 

但是也不要工作。

有没有一种很好的方法来实现这一要求?

2 个答案:

答案 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

让我知道这是否适合您。