コピペ用!!おれ的Djangoのチートシート

2021年12月30日Djangoの豆知識

自分用にメモしていたDjangoのチートシートをここで公開してみます。各ファイルごとによく使うものをまとめています。

models.py

テンプレ

# ブログ用のmodels.pyとして
from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=30)
    contents = models.TextField()

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "記事"
        verbose_name_plural = "記事"

各Field型

コピペ用です。よく使う項目を詳細に解説した記事はこちらにあります。

# CharField(短い文字列)
title = models.CharField(max_length=20) 

# TextField(長い文字列)
contents = models.TextField()

# IntegerField(整数値)
count = models.IntegerField()

# DateTimeField(日時)
time = models.DateTimeField()

# EmailField(メールアドレス)
email = models.EmailField()

# ForeignKey(一対多)
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="blog_set_of_this_category")

# ManyToManyField(多対多)
tag = models.ManyToManyField(Tag, related_name="blog_set_of_this_tag")

views.py

import部分

「どこからimportするんだったっけ?」という時のため 。

HttpResponse

from django.http import HttpResponse

render

from django.shortcuts import render

get_object_or_404

from django.shortcuts import get_object_or_404

get_list_or_404

from django.shortcuts import get_list_or_404

Qオブジェクト

from django.db.models import Q

F関数

from django.db.models import F

パラメータの取得

パスパラメータの取得

urls.pyで

path('<str:slug>’, views.your_func,name=’your-route’)とした時

def your_func(request,slug):
    # hogehoge

クエリパラメータの取得

https://example.com/?q=your_queryの時


a = request.GET['q'] → "your_query"

ホスト、ドメイン、HTTPメソッドなどをrequestから取得

https://example.com/search/?q=django の時

request.scheme → "https"
request.get_host() → "example.com"
request.path → "/search/"
request.get_full_path() → "/search/?q=django"
request.build_absolute_uri() → "https://example.com/search/?q=django"

その他

request.method → "GET" or "POST" or etc,

request.META → REMOTE_ADDRなどたくさん入った辞書型

request.headers → ヘッダー

ORMまとめ

Blogというモデルが存在したとして。

絞り込みの仕方

通常のカラム
from .models import Blog

# pkがaのブログを一つだけ取得
a_blog = Blog.objects.get(pk="a")

# priceが100のブログを絞り込み
blogs = Blog.objects.filter(price=100)

# priceが100でないブログを絞り込み
blogs = Blog.objects.exclude(price=100)

# 
複数条件で絞り込み
i: AND条件のとき
ii: OR条件のとき

Qオブジェクトを使う

一対多や多対多での絞り込みの時

ManyToManyFieldへのアクセス

対象のオブジェクトをblogとして取得(blog=Blog.objects.get(id=id))した後、多対多の関係にあるTagをアクセスさせる

追加
blog.tag.add(tag_obj)
取り除く
blog.tag.remove(tag_obj)
すべて取り除く
blog.tag.clear()

DjangoRestFrameworkの時

APIView

from rest_framework.views import APIView
from rest_framework.response import Response

class YourClass(APIView):
    def get(self, request, format=None):
        # do something
        return Response("hogehoge")

    def post(self, request, format=None):
        # do something
        return Response("hogehoge")

    def put(self, request, format=None):
        # do something
        return Response("hogehoge")

    def delete(self, request, format=None):
        # do something
        return Response("hogehoge")

urls.py

プロジェクト部分

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls), # 管理サイト用
    path('your-path/',include('your_app.urls')), # 普通のアプリ用
]

アプリ部分

from django.urls import path
from . import views

app_name = 'your-app'

urlpatterns = [
    path('',views.your_func,name='func'), # 関数を使う時(function-based view)
    path('class',views.YourClass.as_view(),name='class'), # クラスを使う時(class-based view)
]

settings.py

日本語への対応

LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

settings.pyにある変数を参照したいとき

from django.conf import settings

# 例:DEBUGの値を取りたいとき
debug = settings.DEBUG

PostgreSQLをデータベースとして使いたい時

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'データベース名',
        'USER': 'ユーザー名',
        'PASSWORD': 'パスワード',
        'HOST': 'ホスト名',
        'PORT': 'ポート番号',
    }
}

serializers.py

admin.py

管理サイトでそのモデルを見れるようにする(=register)。

from django.contrib import admin
from .models import YourModel

admin.site.register(YourModel)

manage.pyのコマンド

以下はターミナルで

(DjangoBabyのサンプルコード等を使っている場合は以下のコマンドの前に docker compose run –rm web を付ける)

# プロジェクトの作成(早速manage.pyではないが)
django-admin startproject config

# アプリケーションの作成
python manage.py startapp your_app

# マイグレーションファイルの作成
python manage.py makemigrations

# migrate
python manage.py migrate

# 開発用サーバーを走らせる
python manage.py runserver

# adminサイトの管理ユーザを作る
python manage.py createsuperuser

# 静的ファイルをまとめる
python manage.py collectstatic

# キャッシュテーブルを作る
python manage.py createcachetable

# 対話モードに入る
python manage.py shell