Assignment #1 | Westagram [Mission 7] 게시물 등록 기능 구현

Jayson Hwang·2022년 5월 21일
0

Westagram Project

목록 보기
8/11
post-thumbnail

1.. Posting app 생성

  • 주로 다루는 데이터의 종류가 달라지는 시점이기때문에 앱을 분리
  • postings app 생성
    python manage.py startapp postings
  • settings.pyINSTALLED_APPS에 App 추가

2.. models.py

from django.db    import models
from users.models import User

class Post(models.Model): 
    user        = models.ForeignKey('users.User', on_delete=models.CASCADE)
    content     = models.TextField(null=True)
    created_at  = models.DateTimeField(auto_now_add=True)
    modified_at = models.DateTimeField(auto_now=True)

    class Meta: 
        db_table = 'posts'

class Image(models.Model): 
    image_url = models.URLField(max_length=500)
    post      = models.ForeignKey('Post', on_delete=models.CASCADE)

    class Meta: 
        db_table = 'images'
  • Post 클래스작성자, 이미지, 내용, 생성시간, 업데이트 시간 추가

  • 인스타그램에서는 게시글을 작성할 때 이미지는 필수이지만, 내용은 필수 X
    따라서, 게시물 내용에 해당하는 content에 null=Ture

  • 한명의 user는 여러개의 다양한 게시물을 등록 가능.
    따라서, User와 Post는 one to many relationship!!!

  • User 클래스와 FK로 연결

user = models.ForeignKey('users.User',on_delete=models.CASCADE)
  • posting app의 post클래스가 users app의 User클래스를 참조하게 하기위해 ForeignKey Field에 users.User를 인자로 받음

  • Post & Image도 one to many relationship

  • 모델 작성 완료 후 makemigartions, migrate 진행

3.. views.py

📌 내가 작성한 Post View 코드

import json
from json.decoder    import JSONDecodeError

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

from postings.models import Post 			 # Post model 불러오기
from users.models    import User 			 # User model 불러오기
from users.utils     import signin_decorator # 데코레이터 불러오기

class PostView(View):
    @signin_decorator  ### 데코레이터 지정
    def post(self, request):
        try: 
            data = json.loads(request.body)
            user = request.user	  ## 데코레이터 안에 값을 user 변수에 할당

            content    = data['content']
            image_list = data['image_url'].split(',')

            post = Post.objects.create(
                content = content,
                user    = user,
            )

            for image_url in image_list: 	
           	# 이미지 모델을 따로 만들었기 때문에, 그리고 이미지는 일대다 관계이기 때문에
            # for loop을 통해서 아래와 같이 생성해준다.
                Image.objects.create(
                    image_url = image_url,
                    post      = post,
                    ## post는 위에서 지정해준 post 값...
                )

            return JsonResponse({'message' : 'SUCCESS'}, status = 200)

        except KeyError: 
            return JsonResponse({"message": 'KEY_ERROR'}, status=400)

    @signin_decorator
    def get(self, request):
        post_list = [{
            'username'  : User.objects.get(id = post.user.id).name,
            'post_id'   : post.id,
            'content'   : post.content,
            'images'    : [image.image_url for image in post.image_set.all()],
            'created_at': post.created_at
            } for post in Post.objects.all()
            ]

        return JsonResponse({'RESULT' : post_list}, status=200)

4..URLconf

postings/urls.py

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

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

profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글