python manage.py startapp postings
settings.py
의 INSTALLED_APPS
에 App 추가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 진행
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)
postings/urls.py
from django.urls import path
from postings.views import PostView
urlpatterns = [
path('/post', PostView.as_view()),
]