해결된 질문
작성
·
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' 오류가 발생하신 듯 보입니다.
모델과 시리얼라이저 정의 간에 서로 맞지 않는 부분이 있는 듯 합니다.
필드 정의를 차근차근 정리해보시면 어떨까요?
화이팅입니다.