在Django Rest Framework中,當一個序列化器嵌套在另一個序列化器中時,如何過濾它?
我的過濾器被強加在DRF視圖集中,但是當您從另一個序列化器內部調用序列化器時,嵌套序列化器的視圖集將永遠不會被調用,因此嵌套結果看起來是未經過濾的。
我嘗試在原始視圖集上添加過濾器,但是它似乎無法過濾嵌套結果,因為嵌套結果被稱為單獨的預提取查詢。(您看到嵌套的序列化程序是反向查找。)
是否可以在嵌套序列化程序本身中添加get_queryset()覆蓋(將其移出視圖集),以在其中添加過濾器?我也嘗試過,沒有運氣。
這是我嘗試過的方法,但似乎沒有被調用:
class QuestionnaireSerializer(serializers.ModelSerializer):
edition = EditionSerializer(read_only=True)
company = serializers.StringRelatedField(read_only=True)
class Meta: model = Questionnaire def get_queryset(self): query = super(QuestionnaireSerializer, self).get_queryset(instance) if not self.request.user.is_staff: query = query.filter(user=self.request.user, edition__hide=False) return query
你可以子類化ListSerializer並覆蓋該to_representation
方法。
默認情況下,該to_representation
方法調用data.all()
嵌套的查詢集。因此,你實際上需要data = data.filter(**your_filters)
在調用該方法之前進行制作。然后,你需要將子類化的ListSerializer
添加為嵌套序列化器的meta上的list_serializer_class
。
- 子類ListSerializer,覆蓋
to_representation
,然后調用super
- 將子類ListSerializer添加為
list_serializer_class
嵌套Serializer
上的meta
這是你的示例的相關代碼。
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
轉載:http://codingdict.com/questions/4908