Django高级进阶[DRF](4. 拓展

2018-11-13  本文已影响0人  錦魚

认证和权限

在模型中增加一个字段
生成迁移文件和执行迁移
去序列化里面把字段给添加上
'operator'
刷新浏览器
重写operator 拿出用户名字段
# 读取用户名
operator = serializers.ReadOnlyField(source='operator.username')

通过认证的用户才能修改

from rest_framework import permissions
permission_classes = ()

创建自己的权限

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    """ 自定义权限只允许对象的所有者编辑它 """
    def has_object_permission(self, request, view, obj):
        # 读取权限允许任何请求
        # 所以我们总是允许GET HEAD POTIONS请求
        if request.method in permissions.SAFE_METHODS:
            return True
        # 只有该出版社的录入者才有权限写
        return obj.operator == request.user
from app01.permissions import IsOwnerOrReadOnly


超链接API

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name='书名')
    publisher = models.ForeignKey('Publisher')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '书'
        verbose_name_plural = verbose_name
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Book
        fields = (
            'id',
            'title',
            'publisher'
        )
class BookList(generics.ListCreateAPIView):
    queryset = Book.objects.all()
    serializer_class = serializers.BookSerializer
    permission_classes = (permissions.IsAuthenticated,)


class BookDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = serializers.BookSerializer
    permission_classes = (permissions.IsAuthenticated)
增加新的路由
url(r'^books/$',views.BookList.as_view()),
url(r'^books/(?P<pk>[0-9]+)/$',views.BookDetail.as_view())
通过外键重写显示字段转化为字符串(StringRelatedField)

publisher = serializers.StringRelatedField(source='publisher.name')


浏览API

导入模块
from rest_framework.reverse import reverse
@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'publishers': reverse('publisher-list', request=request, format=format),
        'books': reverse('books_list', request=request, format=format)
    })
from django.conf.urls import url, include
from app01 import views

urlpatterns = [

    url(r'^publishers/$', views.PublisherList.as_view(), name='publisher-list'),
    url(r'^publishers/(?P<pk>[0-9]+)/$', views.PublisherDetail.as_view(), name='publisher-detail'),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest-framework')),
    url(r'^books/$', views.BookList.as_view(), name='books_list'),
    url(r'^books/(?P<pk>[0-9]+)/$', views.BookDetail.as_view(), name='books-detail')

]

刷新浏览器,展示所有api



分页

设置分页样式(setting.py)
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',

分页相关

上一篇 下一篇

猜你喜欢

热点阅读