ModelSerializer
1 2 3 4 5 6 7 8 9 |
# serializer.py from rest_framework.serializers import ModelSerialzier from blog.models import PostModel class PostSerializer(ModelSerializer): class Meta: model = PostModel fields = '__all__' |
data
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
''' When a serializer is passed a `data` keyword argument you must call `.is_valid()` before attempting to access the serialized `.data` representation. You should either call `.is_valid()` first, or access `.initial_data` instead. ''' data = {'title':'title', 'content':'content'} # create s = PostSerialzier(data=data) if s.is_valid(): s.save() else: print(s.errors) # update obj = PostModel.objects.get(id=1) s = PostSerialzier(obj, data=data) if s.is_valid(): s.save() else: print(s.errors) |
retrieve lookup
1 2 3 4 5 6 7 8 9 10 11 |
# views.py class PostModelRetrieveAPIView(RetrieveAPIView): queryset = PostModel.objects.all() serializer_class = PostModelSerializer lookup_field = 'id' lookup_url_kwarg = 'primary_key' # default = 'pk' # urls.py urlpatterns = [ url(r'^retrieve/(?P<primary_key>\d+)/$', PostModelRetrieveAPIView.as_view(), name='retrieve') ] |
Override APIView
1 2 3 4 5 6 |
class PostModelCreateAPIView(CreateAPIView): serializer_class = PostModelSerializer queryset = PostModel.objects.all() def perform_create(self, serializer): serializer.save(user=self.request.user) |
permission
1 2 3 4 5 6 7 8 9 10 11 12 |
from rest_framework.permissions import ( AllowAny, IsAuthenticated, IsAdminUser, IsAuthenticatedOrReadOnly, ) class PostModelCreateAPIView(CreateAPIView): serializer_class = PostModelSerializer queryset = PostModel.objects.all() permission_classes = [AllowAny] |
HyperlinkedIdentityField
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from rest_framework.serializers import ModelSerializer, HyperlinkedIdentityField from blog.models import PostModel class PostModelListSerializer(ModelSerializer): retrieve_url = HyperlinkedIdentityField( view_name='blog:api:retrieve', lookup_field='id' ) destroy_url = HyperlinkedIdentityField( view_name='blog:api:destroy', lookup_field='id' ) class Meta: model = PostModel fields = ['retrieve_url', 'destroy_url'] |
MethodField
1 2 3 4 5 6 7 8 9 10 |
class PostModelListSerializer(ModelSerializer): user = SerializerMethodField() class Meta: model = PostModel fields = ['user'] @staticmethod def get_user(obj): return obj.user.username |