인프런 커뮤니티 질문&답변

윤해빈님의 프로필 이미지

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

포스팅 쓰기 화면 및 API 구현

(수정)한 포스팅에 사진 여러장을 업로드하려고 수정해봤습니다

해결된 질문

작성

·

395

·

수정됨

0

하나의 포스팅에 여러 이미지들을 업로드하는 코드를 선생님 강좌를 보면서 나름대로 수정해봤는데 코드가 많이 엉킨 것 같습니다.

우선 코드부터 보여드리자면

mainfunc/models.py

from django.db import models
from django.conf import settings
from django.contrib.auth.models import User


#Label 테이블 -- 유저(외래키), 레이블
class Label(models.Model):
    id = models.BigAutoField(primary_key=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    label_name = models.CharField(max_length=50, default='')

#Post 테이블 -- 레이블(외래키), 이미지
class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    label = models.ForeignKey(Label, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='images/%Y/%m/%d', blank=True, null=True)

    def __str__(self):
        return f'{self.label}'


mainfunc/serializers.py

from rest_framework import serializers
from .models import Post, Label
from django.contrib.auth import get_user_model

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = '__all__'

class PostSerializer(serializers.ModelSerializer):
    # post에서 이미지를 한번에 입력받아서 저장할 것이기 때문.
    image = serializers.ImageField(use_url=True)
    class Meta:
        author = AuthorSerializer(read_only=True)
        model = Post
        fields = ['image']

class LabelSerializer(serializers.ModelSerializer):
    images = PostSerializer(many=True, read_only=True)

    def get_images(self, obj):
        image = obj.post_set.all()
        return PostSerializer(instance=image, many=True).data

    class Meta:
        model = Label
        fields = ['author', 'label', 'images']
       # fields = '__all__'

    def create(self, validated_data):
        instance = Label.objects.create(**validated_data)
        image_set = self.context['request'].FILES
        for image_data in image_set.getlist('image'):
            Post.objects.create(label=instance, image=image_data)
        return instance

mainfunc/views.py

from rest_framework.viewsets import ModelViewSet
from .serializers import PostSerializer
from .models import Post
from rest_framework.permissions import AllowAny
from django.db.models import Q

# CRUD가 모두 들어간 API를 지원
class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    #permission_classes = [AllowAny] #FIXME: 인증 적용

    def get_queryset(self):
        qs = super().get_queryset()
        qs = qs.filter(
            # "author" 필드가 현재 요청한 사용자 (self.request.user)와 동일한 값을 가지는 객체만 필터링
            Q(author=self.request.user) #본인이 작성한 글만 볼 수 있도록 함.
        )
        return qs
    
    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
        return super().perform_create(serializer)

 

 

model 설계가 잘못된걸까요?

답변 1

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

제가 해빈 님 코드의 의도를 파악하긴 힘들지만

아래 코드에서, validated_data로 데이터를 넘기셨는 데
instance = Label.objects.create(**validated_data)

해당 시리얼라이저는 LabelSerializer이고, Meta 필드로서 author, label, images 필드가 지정되어있네요. 그래서 validated_data에 label이 있었던 것이구요.

Label모델 에는 label 필드가 없는 데, LabelSerializer에는 지정하셨구요. 그러니 Label() got an unexpected keyword argument 'label' 오류가 발생하신 듯 보입니다.

모델과 시리얼라이저 정의 간에 서로 맞지 않는 부분이 있는 듯 합니다.

필드 정의를 차근차근 정리해보시면 어떨까요?

화이팅입니다.