diff --git a/Restaurants/admin.py b/Restaurants/admin.py index 8c38f3f..f36b7c5 100644 --- a/Restaurants/admin.py +++ b/Restaurants/admin.py @@ -1,3 +1,10 @@ from django.contrib import admin +from .models import * # Register your models here. +admin.site.register(Restaurant) +admin.site.register(Menu_Detail) +admin.site.register(Food) +admin.site.register(Menu) +admin.site.register(Restaurant_Food) +admin.site.register(Category) \ No newline at end of file diff --git a/Restaurants/models.py b/Restaurants/models.py index 71a8362..afe15af 100644 --- a/Restaurants/models.py +++ b/Restaurants/models.py @@ -1,3 +1,52 @@ from django.db import models +from enum import unique # Create your models here. + + +class Category(models.Model): + name = models.CharField(max_length=100, verbose_name="category_name") + image = models.ImageField(upload_to="", default='media/default_image.jpeg') + def __str__(self): + return self.name + +class Food(models.Model): + category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="food_category") + name = models.CharField(max_length=100, verbose_name="Food_name") + image = models.ImageField(upload_to="", default='media/default_image.jpeg') + def __str__(self): + return self.name + +class Restaurant(models.Model): + name = models.CharField(max_length=100, verbose_name="restaurant_name", null=False) + address = models.CharField(max_length=200, verbose_name="restaurant_address", null=False) + open_close_time = models.TextField(max_length=1000, verbose_name="open_close_time", null=True) + image = models.ImageField(upload_to="", default='media/default_image.jpeg') + phone = models.CharField(max_length=20, verbose_name="phone") + link = models.URLField(max_length=200) + latitude = models.FloatField(max_length=100, null=False) + longitude= models.FloatField(max_length=100, null=False) + koogle_ranking = models.IntegerField(verbose_name="koogle_ranking") + def __str__(self): + return self.name + +class Menu_Detail(models.Model): + name = models.CharField(max_length=100) + image = models.ImageField() + price = models.DecimalField(max_digits=8, decimal_places=2) + content = models.TextField(max_length=1000, verbose_name="menu_detail_content") + def __str__(self): + return f'{self.name} is in menu' + +class Menu(models.Model): + restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE) + food = models.ManyToManyField(Menu_Detail) + def __str__(self): + return f'{self.food.name} is in {self.restaurant.name}menu' + +class Restaurant_Food(models.Model): + restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name="restaurant_food_restaurant") + food = models.ForeignKey(Food, on_delete=models.CASCADE, related_name="restaurant_food_food") + + def __str__(self): + return f'{self.food.name} is in {self.restaurant.name}' \ No newline at end of file diff --git a/Restaurants/serializers.py b/Restaurants/serializers.py new file mode 100644 index 0000000..0ecdf3e --- /dev/null +++ b/Restaurants/serializers.py @@ -0,0 +1,9 @@ +from rest_framework import serializers +from .models import Category, Food, Restaurant + +class RestaurantSerializer(serializers.ModelSerializer): + class Meta: + model = Restaurant + fields = '__all__' + +# 다른 직렬화 클래스들도 동일한 방식으로 작성 diff --git a/Restaurants/urls.py b/Restaurants/urls.py new file mode 100644 index 0000000..fa176f2 --- /dev/null +++ b/Restaurants/urls.py @@ -0,0 +1,8 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('api/food//restaurants/', views.get_restaurants_by_food), + path('', views.main_page, name='main_page'), + # 다른 URL 패턴들도 추가 +] \ No newline at end of file diff --git a/Restaurants/views.py b/Restaurants/views.py index 91ea44a..314e0b1 100644 --- a/Restaurants/views.py +++ b/Restaurants/views.py @@ -1,3 +1,61 @@ +from rest_framework.decorators import api_view +from rest_framework.response import Response +from .models import Category, Food, Restaurant +from .serializers import RestaurantSerializer + +from django.contrib.gis.geos import Point #pip install geopy +from geopy.distance import great_circle +from django.contrib.gis.measure import Distance + +@api_view(['POST']) +def get_restaurants_by_selected_items(request): + selected_items = request.data.get('selected_items', []) + sort_by = request.data.get('sort_by') + + if not selected_items: + return Response({"error": "No selected items provided"}, status=400) + + + user_latitude = request.data.get('latitude') # 사용자 위치의 위도 + user_longitude = request.data.get('longitude') # 사용자 위치의 경도 + user_location = Point(user_longitude, user_latitude) + + restaurants = Restaurant.objects.filter( + restaurant_food__food__id__in=selected_items + ) + + #거리순 정렬 + if sort_by == 'distance': + restaurants = sorted( + restaurants, + key=lambda restaurant: great_circle( + (restaurant.latitude, restaurant.longitude), + (user_latitude, user_longitude) + ).meters + ) + # 거리를 계산하여 응답 데이터에 추가 + serialized_data = [] + for restaurant in restaurants: + distance = great_circle( + (restaurant.latitude, restaurant.longitude), + (user_latitude, user_longitude) + ).meters + serialized_data.append({ + "restaurant_info": RestaurantSerializer(restaurant).data, + "distance": distance # 거리 정보를 추가 + }) + + #평점순 정렬 + if sort_by == 'rating': + restaurants = restaurants.order_by('-koogle_ranking') + + serialized_data = RestaurantSerializer(restaurants, many=True).data + return Response(serialized_data) + + from django.shortcuts import render +from .models import Category -# Create your views here. +def main_page(request): + categories = Category.objects.all() + return render(request, 'main_page.html', {'categories': categories}) \ No newline at end of file diff --git a/config/urls.py b/config/urls.py index ee45a6b..150aa77 100644 --- a/config/urls.py +++ b/config/urls.py @@ -15,11 +15,12 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), + path('restaurants/', include('restaurants.urls')), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)