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..861c556 100644 --- a/Restaurants/models.py +++ b/Restaurants/models.py @@ -1,3 +1,53 @@ 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") + #visit_count = models.PositiveIntegerField(default=0) + 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}' 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..34ccd08 --- /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'), + path('search/', views.search_restaurants, name='search_restaurants'), #검색 +] \ No newline at end of file diff --git a/Restaurants/views.py b/Restaurants/views.py index 91ea44a..4aedd49 100644 --- a/Restaurants/views.py +++ b/Restaurants/views.py @@ -1,3 +1,90 @@ +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(['GET']) +def get_restaurants_by_selected_items(request, food_id): + 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 + ).distinct() + + #거리순 정렬 + 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 + }) + + #평점순 정렬 + elif sort_by == 'rating': + restaurants = restaurants.order_by('-koogle_ranking') + serialized_data = RestaurantSerializer(restaurants, many=True).data + + # 방문순 정렬 + # elif sort_by == 'visit_count': + # restaurants = Restaurant.objects.order_by('-visit_count') + # serialized_data = RestaurantSerializer(restaurants, many=True).data + + # return Response(serialized_data) + from django.shortcuts import render +from .models import Category + +def main_page(request): + categories = Category.objects.all() + return render(request, 'main_page.html', {'categories': categories}) + + +#검색창 +@api_view(['GET']) +def search_restaurants(request): + search_query = request.GET.get('q') # 검색 + + if search_query: + matching_restaurants = Restaurant.objects.filter(name__icontains=search_query) + serialized_data = RestaurantSerializer(matching_restaurants, many=True).data + return Response(serialized_data) + else: + return Response([]) + + +from django.shortcuts import render, get_object_or_404 +from .models import Restaurant + +def restaurant_detail(request, restaurant_id): + restaurant = get_object_or_404(Restaurant, pk=restaurant_id) + restaurant.visit_count += 1 + restaurant.save() + + return render(request, 'restaurant_detail.html', {'restaurant': restaurant}) -# Create your views here. 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)