Django（python）とRails（ruby）のコマンド・記法対応

# はじめに
普段はRailsを書くことが多いのですが、たまにDjangoを触った時に毎回コマンドやら記法を忘れるので、自分の備忘録のために、RailsとDjangoで近しいコマンドや記法をまとめました。
出会ったタイミングで追記していきます。

# 開発
||Django（Python）|Rails（ruby）|
|---|---|---|
|開発サーバの起動|`python manage.py runserver`|`rails s`<br>`rails server`|
|開発サーバの起動（port指定）|`python manage.py runserver 8080`|`rails s -p 8080`|
|consoleの起動|`python manage.py shell`<br>もろもろimportしておきたい場合：<br>`python manage.py shell_plus`|`rails c`<br>`rails console`|
|使用できるコマンドの一覧|`python manage.py`<br>`=> management/commands/hogehoge.py`|`rake -vT`<br>rake taskは`lib/tasks`以下に追加|
|コマンドの実行|`python manage.py hogehoge`|`rake hogehoge`|
|URLの表示|`pip install django-extensions`<br>settings.pyに<br>`INSTALLED_APPS += ('django_extensions', )`<br>`python manage.py show_urls`|`rake routes`|
|inspect|# python manage.py shell実行したのち<br>`import inspect`<br>`q = Question.objects.get(id=1)`<br>`inspect.getmembers(q)`|# pry gemを利用<br># rails consoleを実行したのち<br>`q = Question.find(1)`<br>`q.inspect`<br>`ls q`|

# データベース関連
||Django（Python）|Rails（ruby）|
|---|---|---|
|migrationファイルの作成|`python manage.py makemigrations`|`rails g migration`|
|migrationの実行|`python manage.py migrate`|`rake db:migrate`<br>`rails db:migrate # Rails 5以上`|
|データベースへ接続|`python manage.py dbshell`|`rails db`|
|ER図の自動生成|[記事](https://pistatium.dev/show/5880983291166720)|[記事](https://qiita.com/TaichiroHasegawa/items/4195cef3865b89589dd9)|

# レコードへのアクセス
||Django（Python）|Rails（ruby）|
|---|---|---|
|レコード全取得|`Question.objects.all()`|`Question.all`|
|インスタンス化して保存|`q = Question(question_text="What's new?", pub_date=timezone.now())`<br>`q.save()`|`q = Question.new(question_text: "What's new?", pub_date: Time.current)`<br>`q.save!`|
|リレーションをはったレコードの作成|リレーションは`*_set`を使う。<br> `q.choice_set.create(choice_text='The sky', votes=0)`|Questionモデルに`has_many :choices`とし、<br> `q.choices.create!(choice_text: 'The sky', votes: 0)`|
|リレーションをはったレコードの全取得|`q.choice_set.all()`|`q.choices`|
|リレーションをはったレコードの件数取得|`q.choice_set.count()`|`q.choices.count`|

#　条件を指定してレコードを取得
|Django（Python）|Rails（ruby）|
|---|---|
|`Question.objects.filter(id=1)`|`Question.where(id: 1)`|
|`Question.objects.filter(question_text__startswith='What')`|`Question.where("question_text like ?", "What%")`|
|`Question.objects.get(id=2)`|`Question.find(2)`|
|`Choice.objects.filter(question__pub_date__year=current_year)`|`Choice.where(question: Question.where(pub_date: Time.current.beginning_of_year..Time.current.end_of_year))`|
|`Choice.objects.get_or_create(id=1)`|`Choice.find_or_create_by(id: 1)`|

# テスト実行
|Django（Python）|Rails（ruby）|
|---|---|
|`python manage.py test`|`rspec spec/ # specの場合`<br>`rails test/ # rails 5以上。minitestの場合`|

# その他
## 継承
```python:Django
class QuestionModelTests(TestCase):
```
```ruby:Rails
class QuestionModelTests < TestCase
```
<!--
## コールバック
```python:Django
post_init
```
```ruby:Rails
after_initialize
```


### 継承
```python:Django
def was_published_recently(self):
    now = timezone.now()
    return now - datetime.timedelta(days=1) <= self.pub_date <= now
```
```ruby:Rails
def was_published_recently
  now = Time.zone.now()
  # self.pub_dateはpub_dateでも可
  return now - 1.day <= self.pub_date && self.pub_date <= now
end
```

### CSV読み取り
```python:Django
with open("csv_path") as rf:
    reader = csv.DictReader(rf, delimiter=',')
    for row in reader:
        print(row)
```
```ruby:Rails
CSV.foreach(file.path, encoding: to_utf8, headers: true) do |row|
  puts row
```


```python
python -c "import django; print(django.__path__)"
```

```
pip freeze > requirements.txt
```
-->