hikaru’s diary

Django Engineer

【Django】モデルについていろいろ書く#3

前回:【Django】モデルについていろいろ書く#2 - hikaru’s diary


クエリ作成を見ていきます。
クエリを作成する | Django ドキュメント | Django


下記のようなモデルを作成し、migrateまで実行したとします。

# ドキュメントから引用
from datetime import date

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField(default=date.today)
    authors = models.ManyToManyField(Author)
    number_of_comments = models.IntegerField(default=0)
    number_of_pingbacks = models.IntegerField(default=0)
    rating = models.IntegerField(default=5)

    def __str__(self):
        return self.headline
CRUD

shellでCRUDします。

>>> from blog.models import Blog
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
>>> b.save()  # create
>>> b = Blog.objects.get(id=1)  # read
>>> all = Blog.objects.all()  # 全件取得 
>>> b.tagline = "The today Beatles news"
>>> b.save()  # update
>>> b.delete()  # delete


外部キーで参照列を取り出したい時は繋げて書く(?)と良いです。
templateでも出来ます。

>>> from blog.models import Entry
>>> tagline = Entry.objects.get(blog_id=1).blog.tagline


参照列がunique=Trueであれば指定することが出来ます
https://docs.djangoproject.com/ja/4.0/ref/models/fields/#django.db.models.ForeignKey.to_field:~:text=special%20syntax.-,ForeignKey.to_field,-%C2%B6


リストのように取り出せます。どのデータでもいいなら一番簡単だと思います。

>>> Entry.objects.all()[0]
>>> Entry.objects.all()[:5]
その他
# ドキュメントから引用
Entry.objects.filter(pub_date__year=2006)


filterの代わりにgetを使うと例外を出してくれるのでけっこう便利です。
https://docs.djangoproject.com/ja/4.0/topics/db/queries/#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,get()%20%E3%82%92%E7%94%A8%E3%81%84%E3%81%A61%E3%81%A4%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B,-%C2%B6


.updateで一括更新する。

# ドキュメントから引用
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')


sql文を発行する。

Entry.objects.all().query

素のsql文を実行する。
ORMは集計などの複雑な処理が苦手なのでsqlで書いたほうが良い時もあります。

Person.objects.raw('SELECT * FROM myapp_person')


以上、お疲れさまでした。