データの作成(Create)
1. createメソッドによる作成
モデルクラスのobjects.create()メソッドを使用
UserModel.objects.create(username="山田太郎", age=25)
2. 辞書データからの作成
辞書データを展開してオブジェクトを作成
user_data = {"username": "鈴木花子", "age": 30}
user_obj = UserModel(**user_data)
user_obj.save()
3. 属性設定による作成
オブジェクトインスタンスを作成後、属性を設定
user_obj = UserModel()
user_obj.username = "佐藤健太"
user_obj.age = 28
user_obj.save()
データの削除(Delete)
1. 単一レコードの削除
getメソッドで特定レコードを取得して削除
UserModel.objects.get(id=5).delete()
2. 複数レコードの一括削除
filterメソッドで条件に合致するレコードを削除
UserModel.objects.filter(age__lt=20).delete()
データの更新(Update)
1. 単一レコードの更新
取得→変更→保存の手順で更新
user_obj = UserModel.objects.get(id=1)
user_obj.username = "更新済みユーザー"
user_obj.save()
2. 複数レコードの一括更新
filterとupdateを組み合わせて一括更新
UserModel.objects.filter(username="old_name").update(username="new_name")
データの取得(Retrieve)
基本的な取得方法
# 全レコード取得
UserModel.objects.all()
# 辞書形式で取得
UserModel.objects.values()
# 特定フィールドのみ辞書形式で取得
UserModel.objects.values('id', 'age')
# タプル形式で取得
UserModel.objects.values_list()
# 特定フィールドのみタプル形式で取得
UserModel.objects.values_list('username')
フィルタリング検索
filterメソッドと検索述語を使用
# 前方一致検索
UserModel.objects.filter(username__startswith="田中")
# 部分一致検索
UserModel.objects.filter(username__contains="user")
検索述語の種類
- exact: 完全一致
- contains: 部分一致(LIKE '%xx%')
- in: リスト内一致
- gt: 大なり
- lt: 小なり
- gte: 以上
- lte: 以下
- startswith: 前方一致(LIKE 'x%')
- endswith: 後方一致(LIKE '%x')
- range: 範囲指定
- regex: 正規表現
条件除外検索
UserModel.objects.exclude(username__contains="admin")
ソート検索
# 昇順ソート
UserModel.objects.order_by('age').values_list('age')
# 降順ソート(フィールド名に-を付与)
UserModel.objects.order_by('-age').values_list('age')
# 複数条件ソート
UserModel.objects.order_by('-age', '-id').values_list('age', 'id')
単一レコード取得
UserModel.objects.get(id=10)
件数取得
UserModel.objects.filter(username="山田太郎").count()
集計クエリ
from django.db.models import Avg, Sum, Count, Max, Min
# 平均値
UserModel.objects.aggregate(avg_age=Avg('age'))
# 合計値
UserModel.objects.aggregate(total_age=Sum('age'))
# 件数
UserModel.objects.aggregate(user_count=Count('age'))
# 最大値
UserModel.objects.aggregate(max_age=Max('age'))
# 最小値
UserModel.objects.aggregate(min_age=Min('age'))