Как отфильтровать объект с выбранными значениями в django_filter - PullRequest
0 голосов
/ 24 января 2019

У меня есть следующее поле выбора в моей модели 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

Я хочу отфильтровать IPInfo по ip_type. Как я могу отфильтровать IPInfo либо «INTRANET» или «ИНТЕРНЕТ». не используйте «1» или «2».

1 Ответ

0 голосов
/ 24 января 2019

Вы можете определить пользовательский метод фильтрации :

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)
...