앞서 진행한 회원가입과 로그인 절차에서는 user라는 앱을 생성하여 사용하였다. 하지만 django에서는 주로 다루는 데이터의 종류가 달라질 때 앱을 분리한다고 한다.
게시물은 사용자 데이터와는 성질이 다른 데이터이므로 앱을 분리해준다.
from django.db import models
from user.models import Account
class Post(models.Model):
user = models.ForeignKey(Account, on_delete=models.CASCADE, null=True)
created_at = models.TimeField(auto_now_add = True, null=True)
content = models.TextField()
image_url = models.URLField()
class Meta:
db_table = 'posts'
게시물의 유저와 서비스에 가입된 사람을 Foreign Key를 이용하여 연결시켜 주기 위해
user
앱의 models
파일에서 Account
클래스를 import 해왔다.
게시물을 등록하는 유저 user
,
게시물이 등록되는 시각 created_at
,
게시물에 대한 글 content
,
게시물이 될 이미지의 url 주소를 담는 image_url
속성을 생성해주었다.
ForeignKey 를 이용해서 Account
클래스와 연결 해주었고 이 때 외래키가 바라보는 값이 삭제될때 외래키를 포함하는 모델 인스턴스(row)도 삭제되도록 하는 on_delete=models.CASCADE
를 사용하였다.
class PostView(View):
def post(self, request):
data = json.loads(request.body)
try:
if Account.objects.filter(email = data['email']).exists():
# 요청받은 이메일주소가 존재하는지 확인
user = Account.objects.get(email = data['email'])
# 존재한다면 해당 이메일 주소(계정)를 가진 사용자 할당
Post(
user = user, # user 속성으로 요청받은 사용자의 정보가 연결
content = data['content'],
image_url = data['image_url'],
).save()
return JsonResponse({'MESSAGE': 'SUCCESS'}, status=200)
return JsonResponse({'MESSAGE': 'INVALID_USER'}, status=401)
except Exception as e:
return JsonResponse({'MESSAGE' : f'NO {e}'}, status = 400)
def get(self, request):
post_list = list(Post.objects.values()) # 등록된 모든 게시물을 불러온다.
return JsonResponse({'post_list': post_list}, status=200)
user
앱의Account
import 잊지 말기
게시물 등록
>>> http POST 127.0.0.1:8000/posting email='cat33@cat.com' content='고양 이' image_url='https://topclass.chosun.com/news_img/1807/1807_008_1.jpg'
게시물 표출
>>> http GET 127.0.0.1:8000/posting
게시물을 불러오면 아래와 같이 게시물에 대한 정보를 확인할 수 있다.
user_id
는 게시물을 등록할 때 입력한 이메일주소를 가진 사용자 고유의 id 값이다.