学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Django3.2 | 19 | QRオーダーシステムの構築 | カテゴリー実装

[18 | ホームページ] << [ホーム] >> [20 | Permission]


カテゴリーを追加するため、「Desktop/QRMenu/qrmenu_server」の実装をします。


「qrmenu_server/qrmenucore/models.py」ファイルを編集します。


記述編集 【QRMenu/qrmenu_server/qrmenucore/models.py】

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Place(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    image = models.CharField(max_length=255)
    number_of_tables = models.IntegerField(default=1)

    def __str__(self):
        return "{}/{}".format(self.owner.username, self.name)
    
class Category(models.Model):
    place = models.ForeignKey(Place, on_delete=models.CASCADE, related_name="categories")
    name = models.CharField(max_length=255)

    def __str__(self):
        return "{}/{}".format(self.place, self.name)
    
class MenuItem(models.Model):
    place = models.ForeignKey(Place, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="menu_items")
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True)
    price = models.IntegerField(default=0)
    image = models.CharField(max_length=255)
    is_available = models.BooleanField(default=True)

    def __str__(self):
        return "{}/{}".format(self.category, self.name)



マイグレーションファイルを作成します。


コマンド
python manage.py makemigrations

マイグレーションファイル作成
マイグレーションファイル作成



作成したマイグレーションファイルを適用します。
python manage.py migrate

マイグレーションファイル適用
マイグレーションファイル適用



「qrmenucore/serializers.py」ファイルを編集します。


記述編集 【QRMenu/qrmenu_server/qrmenucore/serializers.py】

from rest_framework import serializers
from . import models

class MenuItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.MenuItem
        fields = ( 'id',  'name', 'description', 'price', 'image', 'is_available', 'place', 'category')

class CategorySerializer(serializers.ModelSerializer):
    menu_items = MenuItemSerializer(many=True, read_only=True)
    class Meta:
        model = models.Category
        fields = ( 'id',  'name', 'menu_items', 'place')

class PlaceDetailSerializer(serializers.ModelSerializer):
    categories = CategorySerializer(many=True, read_only=True)
    class Meta:
        model = models.Place
        fields = ( 'id',  'name', 'image', 'number_of_tables', 'categories')

class PlaceSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Place
        fields = ('id', 'name', 'image')
        



「qrmenucore/views.py」ファイルを編集します。


記述編集 【QRMenu/qrmenu_server/qrmenucore/views.py】

from rest_framework import generics
from . import models, serializers

# Create your views here.
class PlaceList(generics.ListCreateAPIView):
    serializer_class = serializers.PlaceSerializer

    def get_queryset(self):
        return models.Place.objects.filter(owner_id=self.request.user.id)
    
    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

class PlaceDetail(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = serializers.PlaceDetailSerializer
    queryset = models.Place.objects.all()

class CategoryList(generics.CreateAPIView):
     serializer_class = serializers.CategorySerializer

class CategoryDetail(generics.UpdateAPIView, generics.DestroyAPIView):
    serializer_class = serializers.CategorySerializer
    queryset = models.Category.objects.all()

class MenuItemList(generics.CreateAPIView):
     serializer_class = serializers.MenuItemSerializer

class MenuItemDetail(generics.UpdateAPIView, generics.DestroyAPIView):
    serializer_class = serializers.MenuItemSerializer
    queryset = models.MenuItem.objects.all()



パスの設定をします。


「qrmenu_server/urls.py」ファイルを以下のように編集します。


記述編集 【QRMenu/qrmenu_server/qrmenu_server/urls.py】

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

from qrmenucore import views

urlpatterns = [
    path('admin/', admin.site.urls),

    path('auth/', include('djoser.urls')),
    path('auth/', include('djoser.urls.authtoken')),

    path('api/places/', views.PlaceList.as_view()),
    path('api/places/<pk>', views.PlaceDetail.as_view()),

    path('api/categories/', views.CategoryList.as_view()),
    path('api/categories/<pk>', views.CategoryDetail.as_view()),

    path('api/menu_items/', views.MenuItemList.as_view()),
    path('api/menu_items/<pk>', views.MenuItemDetail.as_view()),
]



管理画面の編集をします。
「qrmenucore/admin.py」ファイルを以下のように編集します。


記述編集 【/QRMenu/qrmenu_server/qrmenucore/admin.py】

from django.contrib import admin
from . import models

# Register your models here.
admin.site.register(models.Place)
admin.site.register(models.Category)
admin.site.register(models.MenuItem)



ブラウザで管理画面を確認します。
http://127.0.0.1:8000/admin/

管理画面確認
管理画面確認



↓↓クリックして頂けると励みになります。


[18 | ホームページ] << [ホーム] >> [20 | Permission]