[Westagram] : 게시물 등록

Kiyong Lee·2021년 10월 3일
0

Django

목록 보기
21/35
post-custom-banner

과제


코드


models.py

from django.db import models

from users.models import TimeStampedModel

class Posting(TimeStampedModel) :
    email   = models.ForeignKey('users.User' ,on_delete=models.CASCADE)
    content = models.TextField(max_length=500, null=True, blank=True)

    class Meta :
        db_table = 'postings'

class Image(TimeStampedModel) :
    img_url = models.CharField(max_length=500, null=True, blank=True)
    posting = models.ForeignKey('Posting', on_delete=models.CASCADE)

    class Meta :
        db_table = 'images'

하나의 포스트에 여러개의 이미지가 있을 수 있으므로, 이미지 테이블을 분리

이미지 테이블은 당연히 포스트의 id를 참조


views.py

class PostingView(View) :
    
    @login_decorator
    def post(self, request) :
        #Posting : content
        #Image   : img_url
        try :
            data = json.loads(request.body)

            email_id   = request.user.id
            img_url = data.get('img_url', None)
            content = data.get('content', None)

            posting = Posting.objects.create(
                email_id = email_id,
                content  = content
            )

            if img_url :
                for imgs in img_url :
                    Image.objects.create(
                        posting_id = posting.id,
                        img_url    = imgs
                    )
                    
        except KeyError :
            return JsonResponse({'message':'KEY_ERROR'}, status=401)

        except json.decoder.JSONDecodeError :
            return JsonResponse({'message':'값을 하나라도 입력하세요'}, status=401)

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

우선 데코레이터에서 선언한 request.user를 불러와서 email_id 변수에 저장

그리고 사진만 올리거나, 글만 쓰거나 등의 경우가 있기 때문에 데이터가 없으면 None

포스팅을 먼저 등록해준 다음, 그에 대한 이미지 파일을 등록해야 하기 때문에

Posting 객체생성 후, Image 객체 생성

이미지는 여러개가 있을 수 있으므로, 리스트로 받아서 for문을 돌린 다음

개수만큼 행데이터로 저장

 @login_decorator
    def get(self, request) :
        #등록된 모든 게시물 / 등록한 사람, 등록한 시간, 게시물url, 게시물 내용

        try :
            postings = Posting.objects.all()

            result = []

            for posting in postings :

                img_url = posting.image_set.all()
                
                url_list = []

                for urls in img_url :

                    url_list.append({
                        'url_list' : urls.img_url
                    })
        
                result.append(
                    {
                        '등록한 사람' : User.objects.get(id=posting.email_id).email,
                        '등록한 시간' : posting.created_at.strftime("%Y-%m-%d %H:%M:%S"),
                        '게시물 url' : url_list,
                        '게시물 내용' : posting.content
                    }
                )

            return JsonResponse({'message':result}, status=201)
        
        except AttributeError as msg :
            return JsonResponse({'message':msg}, stauts=400)
        
        except TypeError as msg :
            return JsonResponse({'message':msg}, stauts=400)

Posting의 id를 Image가 참조하기 때문에 역참조릴 이용하여 이미지를 가져옴

시간의 경우 strftime()을 이용해 형변환

profile
ISTJ인 K-개발자
post-custom-banner

0개의 댓글