restful ListCreateAPIView 类简单使用

序列化器Serializer

视图函数views

from rest_framework.generics import ListCreateAPIView

class PoemFourAPI(ListCreateAPIView):

    poems = Poem.objects.all()
    queryset = poems
    serializer_class = PoemNewSerializer

只写短短三行然后在urls中完成路由分发即可实现get post请求的处理返回

ListCreateAPIView 类

class ListCreateAPIView(mixins.ListModelMixin,
                        mixins.CreateModelMixin,
                        GenericAPIView):
    """
    Concrete view for listing a queryset or creating a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

可以看出ListCreateAPIView 实现了 get post 方法 继承了三个类 而GenericAPIView类继承了APIView 在之上APIView继承 常规python 的View 。
因此 实现get post 方法可以处理get post 请求。
put 和 delete等其他请求 不确定 研究的不是很深啊。。。

先说get
如果是get请求。那么调用get方法 可以看出ruturn 的是 list()方法的返回值。list方法在mixins.ListModelMixin类中定义

class ListModelMixin(object):
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

类中只有一个 方法 返回的是Response(serializer.data)
serializer.data 是序列化的数据
可以知道 最后返回的是序列化数据 和queryset 有关
self.filter_queryset方法与self.get_queryset()方法在GenericAPIView类中

def filter_queryset(self, queryset):
    for backend in list(self.filter_backends):
        queryset = backend().filter_queryset(self.request, queryset, self)
    return queryset



 def get_queryset(self):
        assert self.queryset is not None, (
            "'%s' should either include a `queryset` attribute, "
            "or override the `get_queryset()` method."
            % self.__class__.__name__
        )

        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            # Ensure queryset is re-evaluated on each request.
            queryset = queryset.all()
        return queryset

我也没看太懂。不过断言一句说明queryset不能为空或者重写get_queryset()方法因此queryset 应该是 数据 可被序列化器使用的数据
因此需要设置queryset 假设有Poem模型
可使
queryset = Poem.objects.all()

数据有了 我们还需要序列化器
serializer = self.get_serializer(queryset, many=True)。
可以看self.get_serializer()方法 同样在GenericAPIView类中实现

def get_serializer(self, *args, **kwargs):
    """
    Return the serializer instance that should be used for validating and
    deserializing input, and for serializing output.
    """
    serializer_class = self.get_serializer_class()
    kwargs['context'] = self.get_serializer_context()
    return serializer_class(*args, **kwargs)

返回的是serialzer_class而且 serializer_class = self.get_serializer_class()可以看出,又是调用一个方法

def get_serializer_class(self):
    assert self.serializer_class is not None, (
        "'%s' should either include a `serializer_class` attribute, "
        "or override the `get_serializer_class()` method."
        % self.__class__.__name__
    )

    return self.serializer_class

并没有什么操作 一个断言 然后返回 。也就是没有serializer_class属性会报错。有serizalizer_class属性。则将会作为get_serializer()函数的返回值去处理queryset
serializer = self.get_serializer(queryset, many=True)

所以我们需要设置 serializer_class。是一个序列化器
serializer_class = PoemNewSerializer

因此简单使用ListCreateAPIView类。get请求只需设置两个属性即可

class PoemFourAPI(ListCreateAPIView):

    queryset =  Poem.objects.all()
    serializer_class = PoemNewSerializer

get请求的返回

[
    {
        "id": 8,
        "title": "关山月",
        "content": "明月出天山,苍茫云海间。\n长风几万里,吹度玉门关。\n汉下白登道,胡窥青海湾。\n由来征战地,不见有人还。\n戍客望边色,思归多苦颜。\n高楼当此夜,叹息未应闲。",
        "price": "100.00"
    },
    {
        "id": 9,
        "title": "咏鹅",
        "content": "鹅鹅鹅,曲项向天歌。白毛浮绿水,红掌拨清波。",
        "price": "45.00"
    },
    {
        "id": 10,
        "title": "赋得古原草送别",
        "content": "离离原上草,一岁一枯荣。  野火烧不尽,春风吹又生。  远芳侵古道,晴翠接荒城。  又送王孙去,萋萋满别情。",
        "price": "45.00"
    },
    {
        "id": 11,
        "title": "望岳",
        "content": "岱宗夫如何,齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生层云,决眦入归鸟。会当凌绝顶,一览众山小。",
        "price": "30.00"
    }
]

post请求
处理post请求会调用self.create()方法 在CreateModelMixin中定义

def create(self, request, *args, **kwargs):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    headers = self.get_success_headers(serializer.data)
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

def perform_create(self, serializer):
    serializer.save()

可以看出这基本就是序列化保存数据文章开头已经介绍
而get_serizlizer方法前文get已经提到 而
request.data是post请求的数据。
APIView 的使用及一点点原理
因此post请求只要设置serializer_class 即可

以上便是restful中ListCreateAPIView类简单使用。没有重写其中方法
具体实际应用中可以重写 get post 方法 或者重写 create list 方法

你可能感兴趣的:(Django,restful)