【问题标题】:How to filter an object with choice filed values in django_filter如何在 django 过滤器中过滤具有选择字段值的对象
【发布时间】:2019-06-18 02:19:37
【问题描述】:

我的模型 IPInfo 中有以下选择字段

class IPInfoModel(models.Model):
    TYPE_INTRANET = 1
    TYPE_INTERNET = 2
    IP_TYPES = (
        (TYPE_INTRANET, u'INTRANET'),
        (TYPE_INTERNET, u'INTERNET'),
    )
    ip = models.GenericIPAddressField("IP", unique=True)
    ip_type = models.SmallIntegerField(choices=IP_TYPES)

我使用 django_filters 过滤 IPInfo。

from django_filters import rest_framework as django_filters 

class IPInfoFilter(django_filters.FilterSet):
    ip_type = django_filters.ChoiceFilter(choices=IPInfoModel.IP_TYPES)

    class Meta:
        model = IPInfoModel
        fields = ["ip_type",]


class IPInfoViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    queryset = IPInfoModel.objects.all()
    serializer_class = IPInfoSerializer
    filter_class = IPInfoFilter

我想过滤 ip_type 上的 IPInfo。如何通过“内部网”或“互联网”过滤 IPInfo。不要使用“1”或“2”。

【问题讨论】:

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


    【解决方案1】:

    你可以定义a custom method for filtering:

    class IPInfoFilter(django_filters.FilterSet):
        ip_type = django_filters.CharFilter(method='filter_ip_type')
    
    
        def filter_ip_type(self, queryset, name, value):
            # create a dictionary string -> integer
            value_map = {v: k for k, v in IPInfoModel.IP_TYPES.items()}
            # get the integer value for the input string
            value = value_map[value]
            return queryset.filter(ip_type=value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-20
      • 2020-05-31
      • 2015-03-12
      • 2021-11-30
      • 2018-08-05
      • 2018-02-25
      • 2018-03-31
      • 1970-01-01
      相关资源
      最近更新 更多