アプロダ、アプリケーションとモデルの作成

Django

概要

DRFとVueで、ファイルアップローダーを作るシリーズの一つです。Djangoアプリケーションを作成し、モデルを作成していきます。

アプリケーションの作成

Rest Frameworkを使っていても開発の流れは同じで、プロジェクトを作成したら、アプリケーションを作る必要があります。manage.pyと同じ階層で、次のコマンドを実行します。

python manage.py startapp nuploader1

アプリケーションの作成コマンドですね。今回、nuploader1というアプリケーション名にしています。django-narito-uploader1の略です。好きな名前にしてください。

project/settings.pyを開き、INSTALLED_APPSに追加します。

INSTALLED_APPS = [
    'nuploader1.apps.Nuploader1Config',  # 追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_cleanup.apps.CleanupConfig',
    'rest_framework'
]

project/urls.pyを次のようにします。

from django.conf import settings
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('uploader/', include('nuploader1.urls')),  # 追加
]


# 開発環境でのメディアファイルの配信設定
urlpatterns += static(
    settings.MEDIA_URL,
    document_root=settings.MEDIA_ROOT
)

nuploader1のurls.pyを読み込むようにしました。次に、nuploader1/urls.pyを作成しておきましょう。

from django.urls import path
from . import views

app_name = 'nuploader1'

urlpatterns = [

]

ビューは後で書くので、urlpatternsリストは空にしておきます。

モデルの作成

nuploader1/models.pyに、次のように書きます。

from django.db import models


class Composite(models.Model):
    name = models.CharField('名前', max_length=255)
    is_dir = models.BooleanField('ディレクトリか', default=True)
    src = models.FileField('ファイルソース', blank=True, null=True)
    parent = models.ForeignKey(
        'self', verbose_name='親ディレクトリ', on_delete=models.CASCADE,
        blank=True, null=True, limit_choices_to={'is_dir': True}
    )
    zip_depth = models.PositiveIntegerField('zipファイルの深さ', default=0)

    class Meta:
        ordering = ('-is_dir', 'name')

    def __str__(self):
        if self.is_dir:
            return f'{self.pk} - {self.name}/'
        else:
            return f'{self.pk} - {self.name}'

    def get_display_name(self):
        if self.is_dir:
            return f'{self.name}/'
        else:
            return f'{self.name}'

今回のファイルアップローダーでは、通常のファイルシステムのような作りです。ディレクトリを作ることができて、その中にディレクトリをネストすることもできますし、ファイルを作ることもできます。このような場合、ファイルとディレクトリを別モデルとして表現するよりは、一つのモデルとして表現するほうが管理しやすいことが多いです。ファイルとディレクトリを1つにまとめたものとして、Compositeという名前にしています。

各フィールドについて

各フィールドも簡単に説明します。ファイル・ディレクトリ名はnameです。

ディレクトリかどうかのフラグとして、is_dirフィールドがあります。

ファイルの場合、ファイルのパスを格納するsrcフィールドですが、ディレクトリの場合は空になります。

親ディレクトリがある場合は、parentフィールドに指定します。親ディレクトリがない、つまり最上位のファイル・ディレクトリはここが空になります。

最後のzip_depthは、そのディレクトリをzipとしてダウンロードしたい場合に使います。

myproject/
    css/
        style.css
    js/
        main.js
    index.html

例えば上のような例の場合、myprojectはzip_depthを1にすると直下...つまりindex.htmlのある階層が、zip_depthを2にするとstyle.cssやmain.jsの階層までZIP圧縮される仕組みにします。

各メソッド等について

class Metaでは、並び順です。これは結果的に、ディレクトリがファイルよりも上に表示され、更に名前順で並び替えられるようになります。

__str__は、管理サイトやデバッグ時に使いやすいよう、pkや名前を表示しています。

get_display_nameは、そのコンポジットの表示名を取得したい場合に使う予定です。ディレクトリの場合は末尾に/をつけて、ディレクトリとファイルの違いがわかりやすいように名前を表示します。

データベースへ反映

ここまでできたら、データベースに今作ったモデルを反映しましょう。

python manage.py makemigrations nuploader1
python manage.py migrate

nuploader1/admin.pyを開き、Django管理サイトでCompositeモデルを扱えるようにします。

from django.contrib import admin
from .models import Composite

admin.site.register(Composite)

Relation Posts

Comment

記事にコメントする

まだコメントはありません。