7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SFC-RGAdvent Calendar 2017

Day 22

DjangoのコマンドをRails並みに充実させたい!

Last updated at Posted at 2017-12-23

私はRubyよりPythonを先に勉強したためか、ほとんどのWebシステムをPythonで書いています。PythonでRailsと同じくらい素晴らしいフレームワークにDjangoがあります。
しかし、Railsをいじってみると、ほとんどの操作がコマンドラインで解決する手軽さには驚きます。
そこで、DjangoでもRails並みの手軽さを実現するためにコマンドラインツールを実装しました。
ここでは、Rails信者とDjango信者が戦う形式でお送りします。

Railsはrails new [app name]があるから楽!

確かに, Djangoはdjango-admin startproject [project name]とコマンドラインが冗長で複雑なので覚えていられません。
なのでMirageでは

mg new

このように実行できるようにしました。
newコマンドを叩くだけで自動的にインタラクティブシェルが聞いてくる内容に答えるだけです。

また、

mg new:ng

でAngularのプロジェクトを自動で作成できるようにしました。さらに--materialなどのオプションでテーマも一緒にインストールされます。

mg new:react

React+Reduxの組み合わせにも対応しています。

RailsのAssets PipelineのようなDjangoとより密接な連携が取れるようにする予定です。

rails g controller hoge huga etc...ないでしょ?

ないですね。そもそもcontroller自体がないと言っても良いのですが、それと同じような働きをするものにDjangoではappというものがあり、頻繁に作成します。python manage.py startapp [app name]とこれもまたコマンドが冗長です。

なのでMirageでは

mg g app hode huga etc...

このように実行できるようにしました。

  • DjangoにはRailsのControllerというのはないです。(Controllerっぽいのはあります)コントローラと同じくらい頻繁に作成するappというものがあります。

まっModelをコマンド一発で作れないっしょ!

確かに、無理ですね。RailsとDjangoのモデルは似ているようで似つかないのですが、いちいちmodels.pyにモデルクラスを書く必要があります。正確にはモデルクラスにテーブル構造を定義することによってマイグレーションを自動で作成してくれます。

Railsなら

rails g model ModelName value:string number:integer

みたいにコマンド一発でできます。

なのでMirageでは

mg g model ModelClass value:string number:integer

このように実行できるようにしました。
ちゃんとモデルクラスも作成されています。

python
from django.db import models

# Create your models here.


class ModelClass(models.Model):
    value = models.CharField(max_length=255)
    number = models.IntegerField()

さらに、文字列の長さを宣言するなどの高度なオプションもコマンドラインで一緒に作れるようにしました。

例えば、uuidカラムをプライマリーキーとしてセットし、文字列の長さを30文字にしたいなどの操作をする場合、

mg g model TestModel uuid:uuid+primary=True script:string+maxlen=400

このようにカラム名とデータ型とともにフィールドオプションを同時に定義できます。
なお、このコマンドによって作成されるクラスは以下のようになっています。

python
class TestModel(models.Model):
    uuid = models.CharField(max_length=30, primary_key=True)
    script = models.CharField(max_length=400)

デバッグサーバー立てるの簡単rails s

Djangoのデバッグサーバーはpython manage.py runserverと非常に長いコマンドを実行しなければなりません。
ここはRailsに習ってmg sこれで起動するようにしました。

RailsのCLIに追いつけ追い越せ

Railsはcontrollerを削除する機能にdestroyコマンドがあります。しかし、destroyしてしまうと復元ができなくなります。現在はgitを使うことが多いので間違えて消してしまっても問題にならないかもしれませんが、コミットし忘れたりした場合に後悔することになります。ですからDjangoではdestoryする際にバックアップを自動的に取るようにしました。

今後

  • Django Rest API Franework周りのサポートを加える。

  • アプリ単位をほかのプロジェクトに移植できる機能を追加する。

Githubとインストール

Github

Django Consoleというパッケージがすでに存在したためDjango Mirageに改めさせていただきました。

pip install django-mirage

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?