Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save ekiara/0c99efae1bf47768bdacd1dc026346c7 to your computer and use it in GitHub Desktop.

Select an option

Save ekiara/0c99efae1bf47768bdacd1dc026346c7 to your computer and use it in GitHub Desktop.
Django Rest Framework Examples - For my Tutorial Group

Django Rest Framework Examples - For my Tutorial Group

models.py

import uuid
from django.db import models

class ActiveManager(models.Manager):
    """Returns only undeleted objects."""
    def get_queryset(self):
        return super().get_queryset().filter(deleted_at__isnull=True)

class Item(models.Model):
    id   = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    deleted_at = models.DateTimeField(null=True, blank=True)
    name = models.CharField(max_length=120)
    content = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    objects = models.Manager()
    active = ActiveManager()

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.name

    def soft_delete(self):
        """Marks the object as deleted by setting deleted_at."""
        self.deleted_at = models.DateTimeField.now()
        self.save()

serializers.py

from rest_framework import serializers
from .models import Item

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'   # exposes id, name, price, created_at

views.py

from rest_framework import viewsets
from .models import Item
from .serializers import ItemSerializer

class ItemViewSet(viewsets.ModelViewSet):  # gives list, create, retrieve, update, destroy
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

items/urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ItemViewSet

router = DefaultRouter()
router.register(r'items', ItemViewSet)  # creates /items/ and /items/<uuid>/

urlpatterns = [
    path('', include(router.urls)),
]

items/apps.py

from django.apps import AppConfig
from rest_framework.routers import DefaultRouter
from .views import ItemViewSet

class ItemsConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'items'

    router = DefaultRouter()
    router.register(r'items', ItemViewSet)

    # convenience property so the root URLconf can iterate easily
    @property
    def api_urls(self):
        return self.router.urls
        

project/urls.py

from django.contrib import admin
from django.urls import path, include
from django.apps import apps

api_urlpatterns = []
for app_config in apps.get_app_configs():
    api_urls = getattr(app_config, 'api_urls', None)
    if api_urls:
        api_urlpatterns.append(path('', include(api_urls)))


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include(api_urlpatterns)),
]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment