簡體   English   中英

在 Python 中,如何覆蓋繼承的 class 的 class 屬性,該屬性本身就是 model 的一個實例?

[英]In Python how can I overwrite the class attribute of an inherited class, where that attribute is itself an instance of a model?

如標題所示,我有一個基本的 class ListView,它有一個需要覆蓋的 Serializer 屬性。 對於我的每個 django 模型,我創建了一個子 ListView class 和一個序列化程序。 因此,例如對於 django model 事件,我們有一個對應的視圖 class EventListView(ListView),並且我們有一個對應的序列化器 class EventSerializer(Serializer)。

Serializer child class 在 ListViewClass 中指定,如下面的代碼所示。 是否可以根據提供給 model 的值自動覆蓋序列化程序,我如何將 model 和序列化程序標記為要覆蓋的屬性,因此不需要在基 class 中指定的值?

class EventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = '__all__'

class ListView(APIView):
    model = <Model to be overwritten>        # Event is set as the default.
    Serializer = <Model Serializer to be overwritten>
    
    queryset = model.objects.all()

    def get(self,request):    
        # !!! Get filter conditions from request
        queryset = ListView.queryset.filter()    # !!! Filter conditions
        serializer = ListView.Serializer(queryset,many=True)
        return Response(serializer.data)

    def post(self,request):
        data = JSONParser.parse(request)
        serializer = ListView.Serializer(data = data)
        if serializer.is_valid():
            return Response(serializer.data, status = 201)
        else:
            return Response(serializer.errors, status = 400)


class EventListView(ListView):
    model = Event

我認為您需要使用self.querysetself.modelself.Serializer而不是ListView.querysetListView.Serializer 然后,在每個子類中,它將使用子類的查詢集 model 和序列化程序,而不是基類ListView的序列化程序。

在每個子類中,您需要重新定義modelquerysetSerializer

class ListView(APIView):
    model = <Model to be overwritten>        # Event is set as the default.
    Serializer = <Model Serializer to be overwritten>
    
    queryset = model.objects.all()

    def get(self,request):    
        # !!! Get filter conditions from request
        queryset = self.queryset.filter()    # !!! Filter conditions
        serializer = self.Serializer(queryset,many=True)
        return Response(serializer.data)

    def post(self,request):
        data = JSONParser.parse(request)
        serializer = self.Serializer(data = data)
        if serializer.is_valid():
            return Response(serializer.data, status = 201)
        else:
            return Response(serializer.errors, status = 400)


class EventListView(ListView):
    model = Event
    Serializer = EventSerializer
    queryset = Event.objects.all()

如果你不想在所有子類上定義查詢集,你可能想添加一個方法來使用queryset獲取查詢集,就像這樣

class ListView(APIView):
    model = <Model to be overwritten>        # Event is set as the default.
    Serializer = <Model Serializer to be overwritten>
    

    def get_queryset():
        return self.model.objects.all()

    def get(self,request):    
        # !!! Get filter conditions from request
        queryset = self.get_queryset().filter()    # !!! Filter conditions
        serializer = self.Serializer(queryset,many=True)
        return Response(serializer.data)

    def post(self,request):
        data = JSONParser.parse(request)
        serializer = self.Serializer(data = data)
        if serializer.is_valid():
            return Response(serializer.data, status = 201)
        else:
            return Response(serializer.errors, status = 400)

事實上,其中很多都是直接在 DRF 中實現的,這將為您節省大量自定義編碼。 查看GenericAPIView ( https://www.django-rest-framework.org/api-guide/generic-views/#genericapiview ) 和ListAPIView ( https://www.django-rest-framework.org/api-guide/generic-views/#listapiview )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM