Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,34 @@ on_delete=models.SET_NULL, null=True
이 옵션은 삭제할 데이터가 참조된 데이터는 그 필드를 NULL로 지정한다.

on_delete=models.PROTECT
이 옵션은 삭제할 데이터가 참조된 곳이 있다면 삭제되지 않는다.
이 옵션은 삭제할 데이터가 참조된 곳이 있다면 삭제되지 않는다.


### viewsets url 설정

({'get':'list'}): 리소스 목록을 반환합니다. HTTP GET 요청에 대응됩니다.
({'get':'retrieve'}): 특정 리소스의 세부 정보를 반환합니다. HTTP GET 요청에 대응됩니다.
({'post':'create'}): 새로운 리소스를 생성합니다. HTTP POST 요청에 대응됩니다.
({'put':'update'}): 특정 리소스의 정보를 업데이트합니다. HTTP PUT 요청에 대응됩니다.
({'put':'partial_update'}): 특정 리소스의 일부 정보를 업데이트합니다. HTTP PATCH 요청에 대응됩니다.
({'delete':'destroy'}): 특정 리소스를 삭제합니다. HTTP DELETE 요청에 대응됩니다.


###
http://localhost:8000/api/v1/categories/places?address=대구광역시&number=053
http://localhost:8000/api/v1/categories/places?address=대구광역시

from rest_framework import viewsets
from .models import Place
from .serializers import PlaceSerializer

class PlaceViewSet(viewsets.ModelViewSet):
queryset = Place.objects.all()
serializer_class = PlaceSerializer

def get_queryset(self):
queryset = super().get_queryset()
address = self.request.query_params.get('address', None)
if address:
queryset = queryset.filter(place_where1__icontains=address)
return queryset
Binary file modified backend/categories/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file added backend/categories/__pycache__/apps.cpython-312.pyc
Binary file not shown.
13 changes: 12 additions & 1 deletion backend/categories/admin.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
from django.contrib import admin
from categories.models import Place
from categories.models import Place, place_Image
from reviews.models import Review
import admin_thumbnails

# Register your models here.
@admin_thumbnails.thumbnail('place_img')
class PlaceImageInline(admin.TabularInline):
model = place_Image
extra = 1

class ReviewInline(admin.TabularInline):
model = Review
extra = 1
Expand All @@ -12,4 +18,9 @@ class PlaceAdmin(admin.ModelAdmin):
search_fields = ('Place_Name','place_where1','place_where2','Category1','Category2',)
inlines = [
ReviewInline,
PlaceImageInline,
]

@admin.register(place_Image)
class PlaceImageAdmin(admin.ModelAdmin):
list_display = ('id', 'place', 'place_img')
30 changes: 19 additions & 11 deletions backend/categories/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Generated by Django 5.0.3 on 2024-04-17 08:17
# Generated by Django 5.0.3 on 2024-04-22 08:37

import django.db.models.deletion
from django.db import migrations, models


Expand All @@ -22,26 +23,33 @@ class Migration(migrations.Migration):
('Category2', models.CharField(blank=True, max_length=255, null=True)),
('Latitude', models.CharField(blank=True, max_length=255, null=True)),
('Longitude', models.CharField(blank=True, max_length=255, null=True)),
('Postal_Code', models.CharField(blank=True, max_length=25, null=True)),
('Postal_Code', models.CharField(blank=True, max_length=50, null=True)),
('place_where1', models.CharField(blank=True, max_length=255, null=True)),
('place_where2', models.CharField(blank=True, max_length=255, null=True)),
('Number', models.CharField(blank=True, max_length=255, null=True)),
('Number', models.CharField(blank=True, max_length=50, null=True)),
('Home_Page', models.TextField(blank=True, null=True)),
('Off_Day', models.CharField(blank=True, max_length=255, null=True)),
('Opening_hours', models.CharField(blank=True, max_length=255, null=True)),
('Parking', models.CharField(blank=True, max_length=255, null=True)),
('Entrance_Fee', models.TextField(blank=True, null=True)),
('Dog_Size', models.CharField(blank=True, max_length=255, null=True)),
('Restrictions', models.CharField(blank=True, max_length=255, null=True)),
('Location_Description', models.CharField(blank=True, max_length=255, null=True)),
('Extra_Fee', models.CharField(blank=True, max_length=255, null=True)),
('how_to_go', models.CharField(blank=True, max_length=255, null=True)),
('place_img', models.ImageField(blank=True, null=True, upload_to='place/', verbose_name='시설_이미지')),
('place_comment', models.CharField(blank=True, max_length=255, null=True)),
('place_production', models.CharField(blank=True, max_length=255, null=True)),
('Dog_Size', models.TextField(blank=True, null=True)),
('Restrictions', models.TextField(blank=True, null=True)),
('Location_Description', models.TextField(blank=True, null=True)),
('Extra_Fee', models.TextField(blank=True, null=True)),
('how_to_go', models.TextField(blank=True, null=True)),
('place_comment', models.TextField(blank=True, null=True)),
('place_production', models.TextField(blank=True, null=True)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='place_Image',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('place_img', models.ImageField(blank=True, null=True, upload_to='place/', verbose_name='시설_이미지')),
('place', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='categories.place', verbose_name='시설 사진')),
],
),
]

This file was deleted.

This file was deleted.

26 changes: 15 additions & 11 deletions backend/categories/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ class Place(CommonModel):
# 오시는길
how_to_go = models.TextField(null=True, blank=True)

# 시설사진
place_img = models.ImageField(
"시설_이미지", upload_to='place/', blank=True, null=True
)
# # 시설사진
# place_img = models.ImageField(
# "시설_이미지", upload_to='place/', blank=True, null=True
# )

# 하고싶은말
place_comment = models.TextField(null=True, blank=True)
Expand All @@ -78,16 +78,20 @@ class Place(CommonModel):
def __str__(self):
return self.Place_Name

def place_images(self):
return self.place_images.all()


# 리뷰 역참조 필드 추가
@property
def reviews(self):
return self.review_manage.all()

# class place_Image(models.Model):
# # place
# place = models.ForeignKey('Place', verbose_name='시설 사진', on_delete=models.CASCADE)
# # 시설사진
# place_img = models.ImageField(
# "시설_이미지", upload_to='place/', blank=True, null=True
# )
class place_Image(models.Model):
# place
place = models.ForeignKey('Place', verbose_name='시설 사진', on_delete=models.CASCADE)
# 시설사진
place_img = models.ImageField(
"시설_이미지", upload_to='place/', blank=True, null=True
)

19 changes: 19 additions & 0 deletions backend/categories/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from rest_framework.serializers import ModelSerializer
from .models import Place , place_Image
from reviews.serializers import ReviewSerializer

class PlaceImageSerializer(ModelSerializer):
class Meta:
model = place_Image
fields = '__all__'


class PlaceSerializer(ModelSerializer):

place_image_set = PlaceImageSerializer(many=True,read_only=False)
review_set = ReviewSerializer(many=True,read_only=True)

class Meta:
model = Place
fields = '__all__'

19 changes: 16 additions & 3 deletions backend/categories/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
from django.urls import path
from categories.views import places
from django.urls import path, include
# from categories.views import places
from categories.views import PlaceViewSet
from rest_framework.routers import DefaultRouter


router = DefaultRouter()
router.register(r'places', PlaceViewSet)

urlpatterns = [
path('places/', places, name='places'),
# 메소드를 따로 지정하지 않아도 사용할수 있는 방식
path('',include(router.urls), name="places"),

# 메소드를 따로따로 지정하는 방식
# path('', PlaceViewSet.as_view({'get':'list'}), name='places'),
# path('{place_id}', PlaceViewSet.as_view({'get':'retrieve'}), name='places'),

# path('places/', places, name='places'),
]
104 changes: 92 additions & 12 deletions backend/categories/views.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,98 @@
from django.shortcuts import render, redirect
from .models import Place, place_Image

# Create your views here.
def places(request):
# # 요청(request)으로부터 사용자 정보를 가져온다.
# user = request.user
# viewsets 사용을 위한 추가
from rest_framework import viewsets
from rest_framework import status
from rest_framework.response import Response
from .serializers import PlaceSerializer
from rest_framework.pagination import PageNumberPagination

class PlaceViewSet(viewsets.ModelViewSet):
queryset = Place.objects.all()
serializer_class = PlaceSerializer
pagination_class = PageNumberPagination
pagination_class.page_size = 20

def list(self, request):
pass

def create(self, request):
pass

def retrieve(self, request, pk=None):
pass

def update(self, request, pk=None):
pass

def partial_update(self, request, pk=None):
pass

def destroy(self, request, pk=None):
pass


# # Create your views here.
# def places(request):
# # # 요청(request)으로부터 사용자 정보를 가져온다.
# # user = request.user

# # 가져온 사용자가 '로그인 했는지' 여부를 가져온다
# is_authenticated = user.is_authenticated
# # # 가져온 사용자가 '로그인 했는지' 여부를 가져온다
# # is_authenticated = user.is_authenticated

# print('user:',user)
# print('is_authenticated:',is_authenticated)
# # print('user:',user)
# # print('is_authenticated:',is_authenticated)

#요청에 포함된 사용자가 로그인하지 않은 경우(AnonymousUser 인 경우)
if not request.user.is_authenticated:
return redirect(request, 'api/v1/users/login/')
# #요청에 포함된 사용자가 로그인하지 않은 경우(AnonymousUser 인 경우)
# if not request.user.is_authenticated:
# return redirect(request, 'api/v1/users/login/')

return render(request, 'categories/places.html')
# return render(request, 'categories/places.html')

# APIview 를 사용할떄
# from rest_framework.views import APIView

# class PlaceListCreateAPIView(APIView):
# def get(self, request):
# places = Place.objects.all()
# serializer = PlaceSerializer(places, many=True)
# return Response(serializer.data)

# def post(self, request):
# serializer = PlaceSerializer(data=request.data)
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data, status=status.HTTP_201_CREATED)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# class PlaceRetrieveUpdateDestroyAPIView(APIView):
# def get_object(self, pk):
# try:
# return Place.objects.get(pk=pk)
# except Place.DoesNotExist:
# return None

# def get(self, request, pk):
# place = self.get_object(pk)
# if place:
# serializer = PlaceSerializer(place)
# return Response(serializer.data)
# return Response({'error': 'Place not found'}, status=status.HTTP_404_NOT_FOUND)

# def put(self, request, pk):
# place = self.get_object(pk)
# if place:
# serializer = PlaceSerializer(place, data=request.data)
# if serializer.is_valid():
# serializer.save()
# return Response(serializer.data)
# return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
# return Response({'error': 'Place not found'}, status=status.HTTP_404_NOT_FOUND)

# def delete(self, request, pk):
# place = self.get_object(pk)
# if place:
# place.delete()
# return Response(status=status.HTTP_204_NO_CONTENT)
# return Response({'error': 'Place not found'}, status=status.HTTP_404_NOT_FOUND)
Binary file modified backend/config/__pycache__/__init__.cpython-312.pyc
Binary file not shown.
Binary file modified backend/config/__pycache__/settings.cpython-312.pyc
Binary file not shown.
Binary file modified backend/config/__pycache__/urls.cpython-312.pyc
Binary file not shown.
Binary file added backend/config/__pycache__/views.cpython-312.pyc
Binary file not shown.
Loading