ساخت Snapp food Clone 🍔 _ بخش دوم

ساختار تکنولوژی های استفاده شدهبا سلام، من صدرا هستم!در ادامه پست قبل که به ساخت مدل ها و migration آنها پرداختیم و در این پست به ساخت Serializer و سپس به مدیریت Request و Response و بروزرسانی admin.py و views.py و urls.py می پردازیم.ساختار routing سمت بک اند با Django Rest Frameworkایتدا یک فایل با نام serializers.py می سازیم و در آن کد های زیر را برای مدل های خود قرار می دهیم.from rest_framework import serializersfrom . import modelsclass CitySerializer(serializers.ModelSerializer):class Meta:model = models.Cityfields = '__all__'class UserSerializer(serializers.ModelSerializer):class Meta:model = models.Userfields = '__all__'class CategorySerializer(serializers.ModelSerializer):class Meta:model = models.Categoryfields = '__all__'class FoodSerializer(serializers.ModelSerializer):class Meta:model = models.Foodfields = '__all__'class ShopsFoodSerializer(serializers.ModelSerializer):Foods = FoodSerializer(many=True, read_only=True)category = CategorySerializer(read_only=True)city = CitySerializer(read_only=True)class Meta:model = models.ShopsFoodfields = '__all__'نکته : به طور ساده و خلاصه فایل serializers.py برای تبدیل مدل های ما به فرمت json و ساخت Rest Api کمک می کند.در مرحله بعد به ساخت views.py می پردازیم.در این فایل ما می خواهیم به مدیریت request و response از سمت کاربر استفاده می شود.شکل کامل ارتباط برقراری بین سرور و کلاینتدر شکل بالا همان طور که مشاهده می کنید ابتدا یک سرور می سازیم برای مدیریت درخواست ها request و پاسخ ها response استفاده می شود.در سمت سرور برای ارتباط برقرار کردن با پایگاه داده database ما از django ORM استفاده می کنیم و در بستر فریم ورک جنگو رست Django rest framework این مدیریت را انجام می دهیم و این ارتباط بین وب اپ و پایگاه داده را برقرار می کنیم.فریم ورک Django rest framework قابلیت مدیریت Rest API را به ما می دهد و ما را قادر می سازد تا بر روی درخواست های GETPOSTPUTDELETEمدیریت بسیار خوب و ساده ای انجام دهیم، ویژگی بسیار مهم این تکنولوژی بستر ساده آن است که ما می توانیم بدون پیچیدگی زیاد آن را مدیریت کنیم.در ادامه به کدهای بخش views.py می پردازیم:from rest_framework.request import Requestfrom rest_framework.response import Responsefrom rest_framework import statusfrom rest_framework.views import APIViewfrom . import modelsfrom . import serializersclass UserViewApi(APIView):def get(self, req: Request):users = models.User.objects.all()serializer = serializers.UserSerializer(users, many=True)return Response(serializer.data, status.HTTP_200_OK)def post(self, req: Request):username = req.data.get('username')password = req.data.get('password')print({username, password})try:user = models.User.objects.get(username=username, password=password)serializer = serializers.UserSerializer(user)return Response(serializer.data, status.HTTP_202_ACCEPTED)except:return Response(None, status.HTTP_401_UNAUTHORIZED)User View APIclass CityViewApi(APIView):def get(self, req: Request):id = req.query_params.get('id')if id != None:cities = models.City.objects.get(pk=int(id))serializer = serializers.CitySerializer(cities)else:cities = models.City.objects.all()serializer = serializers.CitySerializer(cities, many=True)return Response(serializer.data, status.HTTP_200_OK) City Routingclass CategoryViewApi(APIView):def get(self, req: Request):id = req.query_params.get('id')if id != None:try:categories = models.Category.objects.get(pk=id)serializer = serializers.CategorySerializer(categories)except:return Response(None, status.HTTP_404_NOT_FOUND)else:categories = models.Category.objects.all()serializer = serializers.CategorySerializer(categories, many=True)return Response(serializer.data, status.HTTP_200_OK)Category Routingclass ShopsFoodViewApi(APIView):def get(self, req: Request):id = req.query_params.get('id')if id != None:try:shopsFood = models.ShopsFood.objects.get(pk=id)serializer = serializers.ShopsFoodSerializer(shopsFood)except:return Response(None, status.HTTP_404_NOT_FOUND)else:shopsFood = models.ShopsFood.objects.all()serializer = serializers.ShopsFoodSerializer(shopsFood, many=True)return Response(serializer.data, status.HTTP_200_OK) Shop Food Routingclass FoodViewApi(APIView):def get(self, req: Request):id = req.query_params.get('id')if id != None:try:food = models.Food.objects.get(pk=id)serializer = serializers.FoodSerializer(food)except:return Response(None, status.HTTP_404_NOT_FOUND)else:food = models.Food.objects.all()serializer = serializers.FoodSerializer(food, many=True)return Response(serializer.data, status.HTTP_200_OK) Food Routingclass SearchApiView(APIView):def get(self, req: Request):city_id = req.query_params.get('city')category_id = req.query_params.get('category')shopsFood = models.ShopsFood.objects.all()if city_id != None:shopsFood = shopsFood.filter(city=city_id)# filter(category=category_id, city=city_id))if category_id != None:shopsFood = shopsFood.filter(category=category_id)serializer = serializers.ShopsFoodSerializer(shopsFood, many=True)return Response(serializer.data, status.HTTP_200_OK)Search Food Routingclass SearchFoodApiView(APIView):def get(self, req: Request):title = req.query_params.get('title')foods = models.Food.objects.all()if title != None:foods = foods.filter(title__contains=title)serializer = serializers.FoodSerializer(foods, many=True)return Response(serializer.data, status.HTTP_200_OK)در ادامه باید برای مدیریت Rest API های موجود در بخش views.py باید بخش urls.py را بروز رسانی کنیم.در ادامه به بروزرسانی بخش urls.py می پردازیم:from django.urls import pathfrom . import viewsurlpatterns = [# path('api/', include('snappApi.urls'))path('user/', views.UserViewApi.as_view()),path('city/', views.CityViewApi.as_view()),path('city/<int:id>', views.CityViewApi.as_view()),path('category/', views.CategoryViewApi.as_view()),path('category/<int:id>', views.CategoryViewApi.as_view()),path('shopFood/', views.ShopsFoodViewApi.as_view()),path('shopFood/<int:id>', views.ShopsFoodViewApi.as_view()),path('food/', views.FoodViewApi.as_view()),path('food/<int:id>', views.FoodViewApi.as_view()),path('search/', views.SearchApiView.as_view()),path('searchFood/', views.SearchFoodApiView.as_view()),]در ادامه باید پنل admin فریم ورک Django هم بروزرسانی کنیم تا مدل های ما را شناسایی کند.در ادامه کدهای بخش admin.py را بروزرسانی می کنیم:from django.contrib import adminfrom .models import City, User, Category, Food, ShopsFood# Register your models here.@admin.register(User)class UserAdmin(admin.ModelAdmin):list_display = ['username', 'city']list_filter = ['city']@admin.register(City)class CityAdmin(admin.ModelAdmin):list_display = ['title']@admin.register(Category)class CategoryAdmin(admin.ModelAdmin):list_display = ['title']@admin.register(Food)class FoodAdmin(admin.ModelAdmin):list_display = ['title', 'price']@admin.register(ShopsFood)class ShopsFoodAdmin(admin.ModelAdmin):list_display = ['title', 'category']list_filter = ['category']تصویر از پنل ادمین Djangoدر این مرحله بخش back end پروژه تمام می شود.اکنون شما یک Rest API برای برنامه تحت وب خود دارید که برای مدیریت مدل هایCityUserCategoryFoodShopsFoodمی باشد و می توانیم به راحتی مدل های بالا را مدیریت کنید.در ادامه به ساخت بخش فرانت اند front end با React.js می پردازیم.