【问题标题】:How to filter a comma separated string in Django Rest Framework?如何在 Django Rest Framework 中过滤逗号分隔的字符串?
【发布时间】:2021-07-24 09:16:00
【问题描述】:

我有一些类似的数据:

position: "1B, 2B, 3B, SS"

我希望能够运行诸如/players/?position=1B 之类的查询,但是,这目前不会返回任何内容,因为这些项目是用逗号分隔的。

这里是views.py的精简版:

class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
    pass

class PlayerProfileFilter(django_filters.FilterSet):
    position = CharInFilter(field_name='display_position', lookup_expr='in')

有没有办法以这种方式过滤数据?

【问题讨论】:

  • @IainShelvington:但是反过来不行吗?因此,这意味着该位置应包含1B, 2B, 3B, SS。但很可能这是一个简单的CharField,因此包含仅在播放器的position 类似于...1B, 2B, 3B, SS... 时才有效
  • @IainShelvington 你是对的。这就是使用 contsins 时的确切行为。

标签: django django-rest-framework django-filter


【解决方案1】:

您可能想使用custom filter

from django.db.models import Q

import django_filters


class PlayerProfileFilter(django_filters.FilterSet):
    position = django_filters.CharFilter(method="my_custom_filter")

    def my_custom_filter(self, queryset, name, value):
        query = Q()
        for position in value.split(","):
            query |= Q(position__contains=position)
        return queryset.filter(query)

【讨论】:

  • 这让我更接近了,但现在我猜是以下错误:'QuerySet' object is not callable
  • @JeremyE 只是提醒一下:如果答案对您有帮助,请点赞并接受:)
【解决方案2】:

我建议创建一个自定义过滤器类。

你可以使用来自django-rest-framework的东西

from rest_framework import filters

class MyFilter(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # logic here
        return queryset

或过滤django-filters

from django_filters.filters import Filter

class MyFilter(Filter):
    def filterself, request, queryset, view):
        # logic here
        return queryset

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多