2019年12月22日

Django ORMでextra句を使用せずカラム間の比較を行う

Django ORMを使用する際、何気なくextra句を使用していた。
先日、別件でDjango ORMのドキュメントをみていると、extra句は将来的にdeprecateされると書いてあった。
これはまずいと思い、extra句を使用している個所を書き換えるべく、とりあえずカラム間比較の方法を調査したので、残しておく。


書き方


F式を利用する

F式
https://docs.djangoproject.com/ja/3.0/topics/db/queries/#filters-can-reference-fields-on-the-model

models.py
from django.db import models class Sample(models.Model): sample_number_1 = models.IntegerField() sample_number_2 = models.IntegerField() class Meta: db_table = 'sample'

F式を使って、Sampleテーブルのsample_number_1とsample_number_2を比較してみる。
>>> from sample.models import Sample >>> from django.db.models import F >>> >>> samples = Sample.objects.filter(sample_number_1__gt=F('sample_number_2')) >>> >>> # 発行されたSQLを確認 >>> print(samples.query) SELECT "sample"."id", "sample"."sample_number_1", "sample"."sample_number_2" FROM "sample" WHERE "sample"."sample_number_1" > ("sample"."sample_number_2")

想定通りのSQLが発行されることを確認できた。

参考


extra句の廃止について
https://docs.djangoproject.com/ja/3.0/ref/models/querysets/#extra

F式
https://docs.djangoproject.com/ja/3.0/topics/db/queries/#filters-can-reference-fields-on-the-model

0 件のコメント:

コメントを投稿