Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Django: onlyとdefer

Posted at

最近学習したアウトプットとしてこの記事を書きました。

例えばこんなmodelがあるとします。

models.py
class Hoge(models.Model):

    title = models.CharField('タイトル', max_length=40)
    description = models.CharField('説明', max_length=100)
    created = models.DateTimeField('作成日時', auto_now_add=True)
    updated = models.DateTimeField('更新日時', auto_now=True)

all()filter()を使ってデータを取得すると思うのですが
基本的に全てのフィールドが取得されますよね?
only()を使うことで指定したフィールドのみの取得
defer()を使うことで指定したフィールド以外の取得が出来ます。

Hoge.objects.only('title', 'description')

基本的にはこれでtitledescriptionのみ取得出来ます
かと思いきやそうではなく他のデータもテンプレートで指定すると取得出来ます。

ただしその場合SQLが乱発されて遅くなるので注意が必要です。

Hoge.objects.defer('created', 'updated')

これも基本的にはcreatedupdated以外の取得が出来る
テンプレートでcreatedupdated指定すると取得出来ます。
その場合もやはりSQLが乱発されて遅くなるので注意が必要です。

膨大なデータがあるときに使用を検討してもいいかもしれませんが誤った使い方をすると却って遅くなることがあるので注意して使うといいかもしれませんね。

もっと詳しい方がご覧になったらご指摘とかいただけたら嬉しいです!

参考URL: QuerySet API reference | Django

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?