Ответ 1
Вы можете подклассифицировать ListSerializer и перезаписать метод to_representation
.
По умолчанию метод to_representation
вызывает data.all()
на вложенном наборе запросов. Поэтому вам действительно нужно сделать data = data.filter(**your_filters)
до вызова метода. Затем вам нужно добавить свой подклассифицированный ListSerializer как list_serializer_class в мета-вложенном сериализаторе.
- Подкласс ListSerializer, перезаписывающий
to_representation
, а затем вызов super - добавить подклассифицированный ListSerializer в качестве мета
list_serializer_class
для вложенного Serializer
Вот соответствующий код для вашего образца.
class FilteredListSerializer(serializers.ListSerializer):
def to_representation(self, data):
data = data.filter(user=self.request.user, edition__hide=False)
return super(FilteredListSerializer, self).to_representation(data)
class EditionSerializer(serializers.ModelSerializer):
class Meta:
list_serializer_class = FilteredListSerializer
model = Edition
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta:
model = Questionnaire