[django][westagram] Mission4 Posting App 구현

문제🧐

Model🧐

ForeignKey() == OneToMany에 해당하조? 그동안 말그대로 이 필드가 있는줄 알았는데... 그게 아니더군요.
다른 OneToOne, OneToMany는 실제 있는데 착각했던거였어요.
그래서 db에 해당 컬럼에 int 로 데이터 유형이 잡혀서 왜? 이메일 문자열을 참조한 테이블에서 가져오지 못하나? 했거든요.
그건 단순히 key값만 참조해서 가져오는 사실을 깨우치게 되었어요.(기초가 중요하네요.)

posting/models.py

from django.db import models

class Post(models.Model):
    user        = models.ForeignKey('user.User', on_delete=models.CASCADE) 
    email       = models.CharField(max_length=30, verbose_name='이메일', default='[email protected]')
    title       = models.CharField(max_length=100,unique=True, default='')
    content     = models.TextField(default='')
    created_dt  = models.DateTimeField(auto_now_add=True)
    image_url   = models.URLField(max_length=2800, default='')

    def __str__(self):
        return self.user
    
    class Meta:
        db_table            = 'postings'
        verbose_name        = 'post'
        verbose_name_plural = 'posts'
        ordering            = ('-created_dt',)



View😏

post()🥨

여기서 살펴볼것은 우선 try...except구문으로 예외 발생에 대한 처리를 해뒀는데요.

post()메서드의 마지막 3개 except를 보면 KeyError, User.DoesNotExists, Post.DoesNotExist 3개 오류 발생시 처리하기 위해 처리를 했습니다.

앞으로 돌아가서 try 바로 아래에 json.loads()를 통해서 request.body로 받아온 부분을 딕셔너리 형태로 변환해줘요.

그 다음 User.objects.get(email=data['email']) 이 부분을 통해서 request로 받아와 data에 저장된 email값을 User클래스의 email 인자에할당해서 db에서 찾게되요. (1. 오류 발생시 예외처리. 2.있으면 user 변수에 담게되요.)

정규 표현식을 이용해서 시간 표현을(YYYY-MM-DD)로 받아 들이도록 형태를 패턴화 했어요.

if not Post.objects.filter(title=title).exists() if문에서는 이메일이 존재 존재하면 True를 뱉어내는데 그때 not 키워드를 만나 not <True(이미 있으면), False(없으면)> POST 요청에서 동일한 제목이 있으면 return JsonResponse({'MESSAGE': 'TITLE ALREADY EXISTS!'}, status=400) 이 값을 반환하고 없으면 Post.objects.create()를 이용해서 값을 저장하는거에요.

get()🥨

그리고 아래 get() 메소드에서는 Post 모델에 저장된 모든 객체를 조회하게됩니다. 하지만 불러 들일때
데이터 타입이 ['객체1','객체2','객체3',...]형태라는점 참고하고 진행해야해요.

값을 return에서 돌려줄때도 JS 타입으로 Response해야하는 만큼 딕셔너리로 형태를 만들어 줄건데요.

[{ }] 컨테이너를 만들어주는게 필요해서 post_list 리스트 변수를 만들어요.
이후 for문을 돌려서 append 메소드를 이용해서 문자열 key와 value를 하나하나씩 나열해서 저장하고 return해주게 되는거종!

import json
import re
from django.http      import JsonResponse
from django.views     import View

from posting.models   import Post
from user.models      import User


class PostView(View):
    def post(self, request):
        try:
            data       = json.loads(request.body)
            
            user       = User.objects.get(email=data['email'])
            email      = data['email']
            title      = data['title']
            content    = data['content']
            created_dt = data['created_dt']
            image_url  = data['image_url']
 

            p = re.compile('^([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))$')

            if not data and user and title and content and created_dt and image_url:
                return JsonResponse({'MESSAGE': "YOUR REQUEST IS NOT ADEQUATE!"},status=400)

            if not p.match(created_dt):
                return JsonResponse({'MESSAGE':'DATE TIME ERROR!'},status=400)
            
            if not Post.objects.filter(title=title).exists():
                Post.objects.create(
                                    user       =user,
                                    email      =email,
                                    title      =title,
                                    content    =content,
                                    created_dt =created_dt,
                                    image_url  =image_url,
                                    )
                return JsonResponse({'MESSAGE': 'POST REQUEST SUCCEEDED!'}, status=200)

            return JsonResponse({'MESSAGE': 'TITLE ALREADY EXISTS!'}, status=400)

        except KeyError:
            return JsonResponse({'MESSAGE': 'KEY ERROR OCCURED!'},status=400)
        
        except User.DoesNotExist:
            return JsonResponse({'MESSAGE':'USER DOES NOT EXISTS!'},status=400)

        except Post.DoesNotExist:
            return JsonResponse({'MESSAGE':'POST DOES NOT EXISTS!'},status=400)

        
    def get(self, request):
        try:
            posts  = Post.objects.all()
            post_list = []
            for i in posts:
                post_list.append(
                     {
                        'posts.id'        :i.id,
                        'posts.user'      :i.user.email,
                        'posts.email'     :i.email,
                        'posts.title'     :i.title,
                        'posts.content'   :i.content,
                        'posts.created'   :i.created_dt,
                        'posts.image_url' :i.image_url,
                    }
                )
            return JsonResponse({'RESULT':post_list }, status=200)
        except Post.DoesNotExist:
            return JsonResponse({'MESSAGE':'POST DOES NOT EXISTS!'},status=400)

URL 😝

프로젝트 디렉토리 안의 urls.py는 아래와 같이 작성했어요.

westagram/urls.py😮

from django.urls import path,include

urlpatterns = [
    path('account', include('user.urls')),
    path('posting', include('posting.urls')),
]

posting/urls.py😮

http -v POST localhost:8000/posting/create email='[email protected]' title='1번째 타이틀' content='내용무' created_dt='2020-12-31' image_url='https://topclass.chosun.com/news_img/1807/1807_008_1.jpg' 처럼 POST 요청을 하도록 했어요.

`http -v GET localhost:8000/posting/read' 모든 객체를 볼러오는 만큼 인자값 입력 없이 마지막 URI read만 입력하면 가능하도록 짜봤어요.

from django.urls import path
from posting.views  import PostView

urlpatterns = [
    path('/create', PostView.as_view()),
    path('/read', PostView.as_view()),
]

느낀점

  • ORM과 QuerySet 공부를 열심히 해야되겠음
  • 파이썬 자료 구조 공부도~

좋은 웹페이지 즐겨찾기