Solo son necesarios 3 pasos:
class MyModel(models.Model):
name = models.CharField(max_length=100)
thing = models.IntegerField()
internal_thing = models.FloatField(null=True, blank=True)
owner = models.ForeignKey(User)
class MyModelViewSet(viewsets.ModelViewSet):
model = MyModel
router = DefaultRouter()
router.register('my-model', MyModelViewSet)
urlpatterns = patterns('',
url(r'^api/v1/', include(router.urls)),
...
)
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
fields = ('id', 'name', 'thing', 'owner')
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
O puedes definirlo globalmente en DEFAULT_MODEL_SERIALIZER_CLASS.
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
O puedes definirlos globalmente en DEFAULT_PERMISSION_CLASSES y DEFAULT_AUTHENTICATION_CLASSES.
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
paginate_by = 10
paginate_by_param = 'page_size'
max_paginate_by = 100
O puedes definirlo globalmente en PAGINATE_BY, PAGINATE_BY_PARAM y MAX_PAGINATE_BY.
class IsOwnerFilterBackend(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
return queryset.filter(owner=request.user)
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
filter_backends = (IsOwnerFilterBackend, filters.OrderingFilter,)
paginate_by = 10
paginate_by_param = 'page_size'
max_paginate_by = 100
O puedes definirlo globalmente en DEFAULT_FILTER_BACKENDS.
class NoModelViewSet(viewsets.ViewSet):
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
def list(self, request):
return Response([{'hello': 'list'}])
def retrieve(self, request, pk=None):
return Response({'hello': pk})
def create(self, request):
return Response({'hello': 'create', 'data': request.DATA})
def update(self, request, pk=None):
return Response({'hello': pk, 'data': request.DATA})
def partial_update(self, request, pk=None):
return Response({'hello': pk, 'data': request.DATA})
def destroy(self, request, pk=None):
return Response({'hello': pk})
class NoModelAPIView(views.APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
permission_classes = (IsAuthenticated,)
def get(self, request, format=None):
return Response([{'hello': 'get'}])
def post(self, request, format=None):
return Response([{'hello': 'post'}])
def put(self, request, format=None):
return Response([{'hello': 'put'}])
def delete(self, request, format=None):
return Response([{'hello': 'delete'}])
class MyModelSerializer(serializers.ModelSerializer):
method_field = serializers.SerializerMethodField('get_method_field_data')
private_data = serializers.Field(source='internal_thing')
def get_method_field_data(self, obj):
return "This is a method generated data!"
class Meta:
model = MyModel
fields = ('id', 'name', 'thing', 'owner', 'private_data', 'method_field')