【问题标题】:Filter is not working properly in Django REST Framework过滤器在 Django REST 框架中无法正常工作
【发布时间】:2022-01-05 07:35:56
【问题描述】:

这是我的 TestViewSet。

class TestViewSet(ListAPIView, CreateAPIView, UpdateAPIView):
permission_classes = [
    IsAuthenticated,
]
pagination_class = CustomPagination
serializer_class = TestSerializer
model = Test
create_class = CreateTestSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['department__name', 'code', 'billing_category__id', 'billing_category__name']

def get_queryset(self):
    name_str = self.request.query_params.get("name")
    department_id = self.request.query_params.get("department_id")
    pk = self.kwargs.get("id")
    self.pagination_class.page_size = page_size
    if name_str is not None:
        return self.model.objects.filter(
            Q(name__icontains=name_str)
            | Q(name__iexact=name_str)
            | Q(name__istartswith = name_str)
            )
    elif pk is not None:
        return self.model.objects.filter(id=pk)
    elif department_id is not None:
        return self.model.objects.filter(department_id=department_id)
    else:
        return self.model.objects.all()

name 是 CharField,department 是 Test Model 中的 ForeignKey。

当我传递这个网址时 - http://127.0.0.1:8000/api/v1/package/test/?name=fun&department_id=7 它忽略了 deparment_id。我只是不知道为什么。单独两者都工作正常。我想知道为什么它忽略 deparment_id ?谢谢!!

【问题讨论】:

  • if-elif-else只会输入一次,你只需要把它分成两个if

标签: python django django-rest-framework


【解决方案1】:

if-elif-else只会输入一次,你需要把它们拆开,像这样:

bool(Q()) 为假

def get_queryset(self):
    name_str = self.request.query_params.get("name")
    department_id = self.request.query_params.get("department_id")
    pk = self.kwargs.get("id")
    self.pagination_class.page_size = page_size

    lookup = Q()
    if name_str is not None:
        lookup |= Q(name__icontains=name_str)
            | Q(name__iexact=name_str)
            | Q(name__istartswith = name_str)
    if department_id is not None:
        lookup &= Q(department_id=department_id)
        # lookup |= Q(department_id=department_id)

    if lookup:
        return self.model.objects.filter(lookup)
    elif pk is not None:
        return self.model.objects.filter(id=pk)
    else:
        return self.model.objects.all()

【讨论】:

  • 嗨@ppig。谢谢你的回复。但这似乎不起作用。当我同时发送名称和部门 ID 时。它现在什么也没返回。
  • @spraj namedepartment_id在查询条件中是|还是&,这个需要你区分一下,从你的代码我看是&提供。
  • & 表示查询返回的结果满足所有条件,| 表示满足任何条件。
  • 好的,知道了。谢谢!!
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2014-07-01
  • 2013-09-15
  • 2020-06-07
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多