2026/01/31

김기훈·2026년 2월 1일

TIL

목록 보기
126/194
# 어제 무엇을 했나요?
- 1. 4주차 프로젝트 정리
- 2. 이력서 페이지 내용 수정

# 오늘은 무엇을 할 것인가요?
- 1. 개인프로젝트 포스트 / 댓글

# 진행하는데 어려운 부분(도움이 필요한 부분)이 있나요?


오늘 학습 내용 ✅

posting

Create

  • serializer

class PostCreateSerializer(serializers.ModelSerializer):
    class Meta:
        fields = [
            "title",
            "content",
            "thumbnail",
        ]
  • service

    • thumbnail=validated_data.get("thumbnail")
      • validated_data.get("thumbnail") 이렇게 사용 할 경우
        • 만약 프론트엔드에서 thumbnail 값을 보내지 않아서 딕셔너리에 이 키(key)가 없다면,
        • 파이썬은 즉시 KeyError를 발생시키고 프로그램이 멈춥니다
      • validated_data.get("thumbnail")
        • 키가 없으면 에러를 내는 대신 None을 반환합니다.
@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
  • tags 추가

# 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


오늘 발생한 문제(발생 했다면) ✅

profile
안녕하세요.

0개의 댓글