фильтровать данные сериализатора django - PullRequest
0 голосов
/ 26 сентября 2018

Много раз мы обращаемся к данным через каталог сериализатора в соответствии с отношениями, определенными в моделях в Django (1.11.10).Как я могу установить фильтр как fetch-only is_active = 1.

class DaasJobsSerializer(serializers.ModelSerializer):
    class Meta:
        model = DaasJobs
        fields = '__all__'

class DaasScheduleSerializer(serializers.ModelSerializer):
    jobs = DaasJobsSerializer(read_only=True,many=True)

    class Meta:
        model = DaasSchedule
        fields = '__all__'

Здесь я просто хочу установить фильтр для выборки только тех заданий, у которых поле db is_active = 1 в этой строке вот так DaasJobsSerializer (read_only = True, многие = True, filter = {"is_active": 1}) как сделать что-то подобное ??

В настоящее время он выдает мне все данные без проверки is_active, ия не хочу создавать serializerMethodField для этого .. потому что все методы, написанные ранее .. я просто устанавливаю поле is_active позже в таблицах в db.

1 Ответ

0 голосов
/ 26 сентября 2018

Если вы хотите сделать это через сериализаторы, вы можете попробовать переопределить ListSerializer и передать его как пользовательский list_serializer_class.

class IsActiveListSerializer(serializers.ListSerializer):

    def to_representation(self, data):
        data = data.filter(is_active=1)
        return super().to_representation(data)

В вашем сериализаторе:

class DaasJobsSerializer(serializers.ModelSerializer):
    class Meta:
        model = DaasJobs
        fields = '__all__'
        list_serializer_class = IsActiveListSerializer  # import it here

Конечно, это конкретный вариант использования, вы можете сделать более обобщенную версию ListSerializer для:

class FilteredListSerializer(serializers.ListSerializer):

    filter_kwargs = {}

    def to_representation(self, data):
        if not self.filter_kwargs or not isinstance(self.filter_kwargs, dict):
            raise TypeError(_('Invalid Attribute Type: `filter_kwargs` must be a of type `dict`.'))
        data = data.filter(**self.filter_kwargs)
        return super().to_representation(data)

И затем вы можете создать подкласс, чтобы сделать другие конкретныеListSerializer, такие как:

 class IsActiveListSerializer(FilteredListSerializer):
     filter_kwargs = {'is_active': 1}

и многие другие ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...