【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')
以上、お疲れさまでした。