如何在Django Rest Framework中過濾嵌套的序列化器?


在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

  1. 子類ListSerializer,覆蓋to_representation,然后調用super
  2. 將子類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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM