1. 程式人生 > >django restframework 簡單總結

django restframework 簡單總結

超鏈接 pre 寫法 users objects lin 查詢 添加 destroy

官方文檔:http://www.django-rest-framework.org/

model.py

class Snippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    books = models.ForeignKey('Books', null=True)

    class Meta:
        ordering = ('created',)


class Books(models.Model):
    booktitle = models.CharField(max_length=50)
    snippets = models.ForeignKey('Snippet')

1.序列化

from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source="owner.name") # 重寫外鍵字段
    class Meta:
        model = User  #表名稱
        fields = ('id', 'username','snippet') # 要序列化的類

2.views

第一種寫法:

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics


class SnippetList(generics.ListCreateAPIView):
    """自動給你寫好get和post"""
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    """自動給你寫好get、put和delete"""
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

第二種寫法:

from rest_framework import viewsets


class SnippetViewSet(viewsets.ModelViewSet):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

3.permissions

permissions.py

from rest_framework import permissions


class IsOwnerOrReadOnly(permissions.BasePermission):
    """
    Custom permission to only allow owners of an object to edit it.
    """

    def has_object_permission(self, request, view, obj):
        # Read permissions are allowed to any request,
        # so we'll always allow GET, HEAD or OPTIONS requests.
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner of the snippet.
        return obj.owner == request.user

上面類的意思是只允許創建者去修改


from snippets.permissions import IsOwnerOrReadOnly

在views.py文件裏添加
類的屬性:
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                  IsOwnerOrReadOnly,)    

4.Hyperlinked APIs 超鏈接

外鍵正向查詢:

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos','books')

urls.py文件裏必須設置name參數,否則會報錯
 url(r'^snippets/$',views.SnippetList.as_view(),
 name='snippet-list'),
url(r'^snippets/(?P<pk>[0-9]+)/$',views.SnippetDetail.as_view(),
 name='snippet-detail'),
 
反向查詢:

class BooksSerializer(serializers.HyperlinkedModelSerializer):

snippets = serializers.HyperlinkedRelatedField(many=True, view_name="snippet-detail",read_only=True)
class Meta:
    model = Books
    fields = ('id', 'booktitle')

django restframework 簡單總結