繁体   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