코딩공부/Python Django

KKU likelion rest project (3)

integerJI 2019. 10. 28. 01:26

이 프로젝트의 목적은 사용자들이 직접 미디어 파일을 업로드할 수 있게 하는 것이다.

 

그러기 위해서는 homework/settings.py에 미디어 파일을 업로드할 수 있게 설정을 해주어야 한다.

 

MEDIA_URL = '/media/'

 

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

 

media url과 root를 설정하여 주었으면

 

project폴더 아래에 media라는 폴더를 만들어 주면 된다.

 

또한 media 폴더 아래에는 files 폴더와 images 폴더를 만들어

 

이곳에 사용자가 올리는 media 파일들이 이미지와 파일을 구분하여 올라가게 해 준다.

 

그러기 위해서 homework/urls.py를 설정하여 주자.

 

from django.contrib import admin

from django.urls import path, include

from rest_framework import urls

from mystorage import urls

 

from django.conf import settings

from django.conf.urls.static import static

 

urlpatterns = [

    path('admin/', admin.site.urls),

    path('', include('mystorage.urls')),

    path('api-auth/', include('rest_framework.urls'))

]

 

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

이제 미디어 파일을 올릴 수 있는 길을 만들었으니

 

mystorage/models.py에서 틀을 만들어봅시다.

 

from django.db import models

from django.conf import settings

 

class Essay(models.Model):

    author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1on_delete=models.CASCADE)

    title = models.CharField(max_length=30)

    body = models.TextField()

 

class Album(models.Model):

    author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1on_delete=models.CASCADE)

    image = models.ImageField(upload_to="images")

    desc = models.CharField(max_length=100)

 

class Files(models.Model):

    author = models.ForeignKey(settings.AUTH_USER_MODEL, default=1on_delete=models.CASCADE)

    myfile = models.FileField(blank=Falsenull=Falseupload_to="files")

    desc = models.CharField(max_length=100)

 

여기서 image와 myfile에 있는 upload_to는 위에서 설명해준 media폴더 아래에 있는 폴더 이름이다.

 

또한 이미지 파일을 활용하기 위해서 Pillow를 설치하여 주자.

 

 

pip install Pillow

Pillow를 설치하고 데이터베이스에 변화가 생겼으니 makemigrations를 해준다.

 

python manage.py makemigrations
python manage.py migrate

models까지 설정을 해주었으면

 

mystorage/urls.py를 설정해 주자

 

from rest_framework.routers import DefaultRouter

from django.urls import path, include

from mystorage import views

 

router = DefaultRouter()

router.register('essay', views.PostViewSet)

router.register('album', views.ImgViewSet)

router.register('files', views.FileViewSet)

 

urlpatterns = [

    path('', include(router.urls)),

]

 

urls.py 다음은 mystorage/views.py 이다.

 

from rest_framework import viewsets

from .models import Essay, Album, Files

from .serializers import EssaySerializer, AlbumSerializer, FilesSerializer

from rest_framework.filters import SearchFilter

 

class PostViewSet(viewsets.ModelViewSet):

 

    queryset = Essay.objects.all()

    serializer_class = EssaySerializer

 

    filter_backends = [SearchFilter]

    search_fields = ('title''body')

 

    def perform_create(selfserializer):

        serializer.save(author=self.request.user)

 

    def get_queryset(self):

        qs = super().get_queryset()

 

        if self.request.user.is_authenticated:

            qs = qs.filter(author = self.request.user)

        else:

            qs = qs.none()

        return qs

 

class ImgViewSet(viewsets.ModelViewSet):

    

    queryset = Album.objects.all()

    serializer_class = AlbumSerializer

 

class FileViewSet(viewsets.ModelViewSet):

    

    queryset = Files.objects.all()

    serializer_class = FilesSerializer

 

views를 설정해 주었으면 mystorage/serializers.py로 가서 serializer를 설정해 주자

 

from .models import Essay, Album, Files

from rest_framework import serializers

 

class EssaySerializer(serializers.ModelSerializer):

 

    author_name = serializers.ReadOnlyField(source='author.username')

 

    class Meta:

        model = Essay

        fields = ('pk''title''body''author_name')

 

class AlbumSerializer(serializers.ModelSerializer):

 

    author_name = serializers.ReadOnlyField(source='author.username')

    image = serializers.ImageField(use_url=True)

 

    class Meta:

        model = Album

        fields = ('pk''author_name''image''desc')

 

class FilesSerializer(serializers.ModelSerializer):

 

    author = serializers.ReadOnlyField(source='author.username')

    myfile = serializers.FileField(use_url=True)

 

    class Meta:

        model = Files

        fields = ('pk''author''myfile''desc')

 

여기서 잠깐 서버를 활성화하여 확인해 보자.

 

정상적으로 album과 files를 추가해 주었다.

'코딩공부 > Python Django' 카테고리의 다른 글

KKU likelion django project (2)  (0) 2020.01.02
KKU likelion django project (1)  (0) 2020.01.02
KKU likelion rest project (4)  (0) 2019.10.28
KKU likelion rest project (2)  (0) 2019.10.27
KKU likelion rest project (1)  (0) 2019.10.27