Django’s generic views… were developed as a shortcut for common usage patterns… They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of data without having to repeat yourself.
基于类的视图的主要优点之一是它们允许您编写可重用行为的部分。REST框架通过提供许多预构建的视图来利用这一点,这些视图提供了常用的模式。
通过REST框架提供的通用视图,可以快速构建与数据库模型紧密映射的API视图。
如果泛型视图不适合自己的 API 的需求,可以使用常规类,或者重用泛型视图使用的 mixin 和基类来组合成一组可重用的泛型视图。
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUser
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAdminUser]
#对于复杂的情况,可以重写视图类中的方法
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = [IsAdminUser]
def list(self, request):
# Note the use of `get_queryset()` instead of `self.queryset`
queryset = self.get_queryset()
serializer = UserSerializer(queryset, many=True)
return Response(serializer.data)
GenericAPIView
1.提供了基础的操作和属性:
- 支持查询集(queryset)的定义,用于指定要操作的数据集合。
- 提供了序列化器类(serializer_class)的设置,用于数据的序列化和反序列化。
2.实现了常见的方法:
- get_queryset():用于获取查询集。
- get_object():用于获取单个对象。
- lookup_field
- lookup_url_kwarg
3.支持分页:可以方便地设置分页类来处理大量数据的分页展示。(pagination_class)
4.与其他扩展类结合:常与 ListCreateAPIView、RetrieveUpdateDestroyAPIView 等结合使用,快速实现常见的 CRUD 操作。
5.过滤:filter_backends, 应用于过滤查询集的过滤器后端类的列表。默认为与设置相同的值
示例代码:
from rest_framework.generics import GenericAPIView
from rest_framework import serializers
from myapp.models import MyModel
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = '__all__'
class MyView(GenericAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get(self, request, *args, **kwargs)