Examples

Basic Example with a ViewSet

Consider the following ViewSet:

class CigarViewSet(viewsets.ModelViewSet):

    """ Cigar resource. """

    serializer_class = CigarSerializer
    model = Cigar
    queryset = Cigar.objects.all()

    def list(self, request, *args, **kwargs):
        """
        Return a list of objects.

        """
        return super(CigarViewSet, self).list(request, *args, **kwargs)

    @action()
    def set_price(self, request, pk):
        """An example action to on the ViewSet."""
        return Response('20$')

    @link()
    def get_price(self, request, pk):
        """Return the price of a cigar."""
        return Response('20$')

with supporting model and serializer:

class Cigar(models.Model):
    FORM_CHOICES = (
        ('parejo', 'Parejo'),
        ('torpedo', 'Torpedo'),
        ('pyramid', 'Pyramid'),
        ('perfecto', 'Perfecto'),
        ('presidente', 'Presidente'),
    )
    name = models.CharField(max_length=25, help_text='Cigar Name')
    colour = models.CharField(max_length=30, default="Brown")
    form = models.CharField(max_length=20, choices=FORM_CHOICES, default='parejo')
    gauge = models.IntegerField()
    length = models.IntegerField()
    price = models.DecimalField(decimal_places=2, max_digits=5)
    notes = models.TextField()
    manufacturer = models.ForeignKey('Manufacturer')

    def get_absolute_url(self):
        return "/api/cigars/%i/" % self.id
class CigarSerializer(serializers.ModelSerializer):
    url = fields.URLField(source='get_absolute_url', read_only=True)

    class Meta:
        model = models.Cigar

From this code, django-rest-swagger will produce the following swagger docs:

_images/cigar.png

Function Based Views

django-rest-swagger also supports function based views. Since the serializers used by a function based view are not readily introspect-able, you can use the yaml parser to manually provide them.

This example also illustrates support for markdown.

def find_jambalaya(request):
    """
    Retrieve a *jambalaya* recipe by name or country of origin
    ---
    request_serializer: JambalayaQuerySerializer
    response_serializer: JambalayaSerializer
    """
    if request.method == 'POST':
        serializer = JambalayaQuerySerializer(data=request.DATA)
        if serializer.data['name'] is not None:
            j = Jambalaya.objects.filter(recipe__contains='name=%s' % serializer.data['name'])
        else:
            j = Jambalaya.objects.filter(recipe__contains="country=%s" % serializer.data['origin'])
        serializer = JambalayaSerializer(j, many=True)
        return Response(serializer.data)
    else:
        return Response("", status=status.HTTP_400_BAD_REQUEST)
_images/jambalaya_find-POST.png

YAML in the class docstring

You can put yaml in the class-level docstring of your view. It must be nested in the name of the method of interest:

class ArtisanCigarViewSet(viewsets.ModelViewSet):

    """
    Cigar resource.
    ---
    get_price:
        omit_serializer: true
    set_price:
        omit_serializer: true
        parameters_strategy:
            form: replace
        parameters:
            - name: price
              type: number
    """

    serializer_class = CigarSerializer
    model = Cigar
    queryset = Cigar.objects.all()

    def list(self, request, *args, **kwargs):
        """
        Return a list of objects.

        """
        return super(ArtisanCigarViewSet, self).list(request, *args, **kwargs)

    @action()
    def set_price(self, request, pk):
        """An example action to on the ViewSet."""
        return Response('20$')

    @link()
    def get_price(self, request, pk):
        """Return the price of a cigar."""
        return Response('20$')
_images/artisan_cigar.png

Raw JSON objects

def create_cigar2(request):
    """
    ---
    response_serializer: CigarSerializer
    parameters:
        - name: body
          pytype: CigarSerializerMinimal
          paramType: body
    """
    in_serializer = CigarSerializerMinimal(data=request.DATA)
    if in_serializer.is_valid():
        cigar = Cigar()
        cigar.name = in_serializer.data['name']
        cigar.gauge = in_serializer.data['gauge']
        cigar.length = 2
        cigar.price = 2
        manufacturer = Manufacturer.objects.first()
        if manufacturer is None:
            manufacturer = Manufacturer()
            manufacturer.name = 'Taco tobacco'
            country = Country.objects.first()
            if country is None:
                country = Country()
                country.name = "Watchacallistan"
                country.save()
            manufacturer.country = country
            manufacturer.save()
        cigar.manufacturer = manufacturer
        cigar.save()
        out_serializer = CigarSerializer(cigar)
        return Response(out_serializer.data,
                        status=status.HTTP_201_CREATED)
    return Response(in_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
_images/raw_json.png