Skip to content

Instantly share code, notes, and snippets.

@chris-surge
Created May 3, 2018 21:24
Show Gist options
  • Save chris-surge/23da2e1d30c7024aaec875046f785e36 to your computer and use it in GitHub Desktop.
Save chris-surge/23da2e1d30c7024aaec875046f785e36 to your computer and use it in GitHub Desktop.
Extracted source code for "Intro to Python"
from django.conf.urls import url, include
from django.contrib import admin
from django.db import models
from rest_framework import serializers, viewsets, routers
# DATA MODEL: expected to be in `models.py`
class Flavor(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Topping(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Order(models.Model):
flavor = models.ForeignKey('Flavor', on_delete=models.DO_NOTHING)
topping = models.ForeignKey('Topping', on_delete=models.DO_NOTHING)
def __str__(self):
return "Someone ordered {} topped with {}".format(self.flavor, self.topping)
# SERIALIZERS: handle content negotiation, generally goes `serializers.py` to reduce clutter
class FlavorSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Flavor
fields = ('name', 'url',)
class ToppingSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Topping
fields = ('name', 'url',)
class OrderSerializer(serializers.HyperlinkedModelSerializer):
order_string = serializers.SerializerMethodField()
class Meta:
model = Order
fields = ('order_string', 'topping', 'flavor')
def get_order_string(self, obj):
return "Someone ordered {} topped with {}".format(obj.flavor, obj.topping)
# VIEWS: Handle responding to HTTP web requests, go in `views.py`
class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.all()
serializer_class = OrderSerializer
class ToppingViewSet(viewsets.ModelViewSet):
queryset = Topping.objects.all()
serializer_class = ToppingSerializer
class FlavorViewSet(viewsets.ModelViewSet):
queryset = Flavor.objects.all()
serializer_class = FlavorSerializer
# ROUTERS: go in a `urls.py` file generally
# Defines the paths given for each ViewSet
router = routers.DefaultRouter()
router.register(r'flavors', FlavorViewSet)
router.register(r'toppings', ToppingViewSet)
router.register(r'orders', OrderViewSet)
# url pattern is django's way of defining routes
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^admin/', admin.site.urls),
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment