TIL 47. Query Set APIとView


Django Query Setの学習を記録します.この文章はengineertodeveloperdjango公式ドキュメントを基礎としている.

QuerySet API


Query Set APIとは?


Once you’ve created your data models, Django automatically gives you a database-abstraction API that lets you create, retrieve, update and delete objects. Django handles all the dirty work of communicating with the database for you.
Django ORMを使用すると、どのデータベースでも同じ言語(Python)でデータベースにアクセスし、データを管理できます.djangoでモデルを作成した以上、データベースにSQL文を1つずつ投げ出す必要はありません.逆に、djangoはデータベースのAPIを提供します.

Creating objects


To represent database-table data in Python objects, Django uses an intuitive system: A model class represents a database table, and an instance of that class represents a particular record in the database table.
djangoは直感的なシステムを使用します.モデル・クラスはデータベース内のテーブルを表し、インスタンスはデータベース・テーブル内の特定のデータ(レコード)を表します.
from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
This performs an INSERT SQL statement behind the scenes. Django doesn’t hit the database until you explicitly call save().

Saving changes to objects


To save changes to an object that’s already in the database, use save().
b5.name = 'New name'
b5.save()
This performs an UPDATE SQL statement behind the scenes. Django doesn’t hit the database until you explicitly call save() .updated_atプロパティでよく使用されるDateTimeFieldのauto_nowはsaveを呼び出す必要があるようです.

Saving ForeignKey and ManyToManyField fields


Updating a ForeignKey field works exactly the same way as saving a normal field – assign an object of the right type to the field in question.
from blog.models import Blog, Entry
entry = Entry.objects.get(pk=1)
cheese_blog = Blog.objects.get(name="Cheddar Talk")
entry.blog = cheese_blog
entry.save()
Updating a ManyToManyField works a little differently – use the add() method on the field to add a record to the relation.
from blog.models import Author
joe = Author.objects.create(name="Joe")
entry.authors.add(joe)

QuerySet


A QuerySet represents a collection of objects from your database. It can have zero, one or many filters. Filters narrow down the query results based on the given parameters. In SQL terms, a QuerySet equates to a SELECT statement, and a filter is a limiting clause such as WHERE or LIMIT.

Manager


You get a QuerySet by using your model’s Manager. Each model has at least one Manager, and it’s called objects by default.
InstanceまたはQuerySet自体がデータを表します.ただし、models.Modelから継承されたマネージャを使用すると、QuerySet API、すなわちデータベースにアクセスできます.マネージャには、通常のマネージャ(オブジェクト)やリファレンスマネージャ、逆リファレンスマネージャなどがあります.
The Manager is the main source of QuerySets for a model. For example, Blog.objects.all() returns a QuerySet that contains all Blog objects in the database.
A Manager is the interface through which database query operations are provided to Django models. At least one Manager exists for every model in a Django application.
Managerは、モデルに対してDBクエリを実行する代わりにインタフェースです.簡単に言えばDBのマネージャーにどのモデルにも少なくとも1人のマネージャーがいます.

allとfilter,exclude

all関数は、モデルクラスのすべてのインスタンスを返し、QuerySetに配置します.filter関数は基本的にallと同じであるが、フィルタは、どのパラメータに対する受信値に基づいて異なる値を返す.exclude関数はフィルタと非常に似ていますが、パラメータ値に対応するインスタンスを含む、QuerySetの他のすべてのインスタンスを返します.

複数種類のフィルタパラメータ

__contains:特定のカラム内のアイテムが特定の値を含むインスタンスのみを返す場合は、モデルで定義されたプロパティの名前に__containsを付けることができます.__startswith:フィルタをどの値で開始するかを指定します.__year__month__day:DateTimeFieldの場合、特定の年月日をフィルタできます.

QuerySets are lazy??


QuerySets are lazy – the act of creating a QuerySet doesn’t involve any database activity. You can stack filters together all day long, and Django won’t actually run the query until the QuerySet is evaluated.
q = Entry.objects.filter(headline__startswith="What")
q = q.filter(pub_date__lte=datetime.date.today())
q = q.exclude(body_text__icontains="food")
print(q)
Though this looks like three database hits, in fact it hits the database only once, at the last line (print(q)). In general, the results of a QuerySet aren’t fetched from the database until you “ask” for them. When you do, the QuerySet is evaluated by accessing the database.

When QuerySets are evaluated


Internally, a QuerySet can be constructed, filtered, sliced, and generally passed around without actually hitting the database. No database activity actually occurs until you do something to evaluate the queryset.

Iteration


A QuerySet is iterable, and it executes its database query the first time you iterate over it. For example, this will print the headline of all entries in the database:

View


ビューとは?


A view function, or view for short, is a Python function that takes a Web request and returns a Web response. This response can be the HTML contents of a Web page, or a redirect, or a 404 error, or an XML document, or an image . . . or anything, really. The view itself contains whatever arbitrary logic is necessary to return that response.
Viewとは、クライアントからの要求を受信し、応答を与えるために必要な論理を指す.この応答は、ウェブページ、リダイレクト、404エラー、JSON、画像などであってもよい.Viewがどのような論理を持っていても、応答を返さなければなりません.

ViewとQuery Set API


実際,Query Set APIが欠けているビューはDBがないサーバと同じである.Viewはurlに対して実行される関数にすぎません.ただし、Query Set APIを使用すると、Djangoサーバはデータベースにアクセスし、情報豊富なサイトを作成できます.
Djangoがモデルに対して実行するQuery Set APIはshellと同様にViewに書き込むことができる.例えば、django Viewは、会員の入力を要求する場合、要求された(request.body)データに基づいてDBにアクセス、変更、および作成することができる.

思考と質問

  • QuerySet APIのすべての関数を学習することは困難である.実戦では使い慣れてみて、あとでそれぞれの違いを整理してみましょう.
  • QuerySet怠け者ってどういう意味ですか?
  • Caching?
  • どの関数が有効かを判断するには、まずSQLとクエリ文を学習します.
  • 正参照マネージャ、逆参照マネージャ、一対のマルチマネージャなど、それぞれ異なる点があります.
  • はまずマネージャーが所有する方法に集中する.各メソッドにはどのような違いがあり、実際にデータベースにどのような変化が作成されますか.