# 어제 무엇을 했나요?
- 1. 4주차 프로젝트 정리
- 2. 이력서 페이지 내용 수정
# 오늘은 무엇을 할 것인가요?
- 1. 개인프로젝트 포스트 / 댓글
# 진행하는데 어려운 부분(도움이 필요한 부분)이 있나요?
class PostCreateSerializer(serializers.ModelSerializer):
class Meta:
fields = [
"title",
"content",
"thumbnail",
]
@transaction.atomic
def create_post(*, author: User, validated_data: dict[str, Any]):
"""
게시글을 생성하는 비즈니스 로직입니다.
"""
post = Post.objects.create(
user=author,
title=validated_data["title"],
content=validated_data["content"],
thumbnail=validated_data.get("thumbnail"),
)
return post
# serializer
class PostCreateSerializer(serializers.ModelSerializer):
tags = serializers.ListField(
child=serializers.CharField(max_length=50),
required=False, # 태그는 없을 수도 있음
write_only=True # 저장할 때만 사용 (응답에는 포함 X)
)
class Meta:
fields = [
"title",
"content",
"thumbnail",
"tags",
]
# service
@transaction.atomic
def create_post(*, author: User, validated_data: dict[str, Any]) -> Post:
# 1. 태그 데이터 분리 (pop을 쓰면 딕셔너리에서 꺼내면서 삭제함)
# 리스트가 없으면 빈 리스트 [] 반환
tags_names = validated_data.pop("tags", [])
# 2. 게시글 생성
post = Post.objects.create(
user=author,
title=validated_data["title"],
content=validated_data["content"],
thumbnail=validated_data.get("thumbnail"), # 안전하게 가져오기
)
# 3. 태그 연결 로직
if tags_names:
for name in tags_names:
# (1) 태그가 DB에 있으면 가져오고, 없으면 생성 (Tag 모델)
# tag는 객체, created는 생성 여부(True/False)
tag, created = Tag.objects.get_or_create(name=name)
# (2) 게시글과 태그를 연결하는 중간 테이블 생성 (PostTag 모델)
# through 모델을 쓸 때는 이렇게 직접 create 하는 것이 정석입니다.
PostTag.objects.create(post=post, tag=tag)
return post
poetry run python manage.py runserver