見出し画像

Django_modelsのfilterやorder_byを使いこなす #234日目

Djangoでは、モデルからレコードを抽出する際、様々な条件設定をすることが可能です。抽出自体にはget()やfilter()を使いますが、今回はfilter()を使います(両者の違いについてはこちらの解説をご参照ください)。

以下のモデルに対して、条件を色々つけて抽出してみます。

class Project(models.Model):
  enterprise = models.ForeignKey('Enterprise', on_delete=models.CASCADE, related_name='projects')
  name = models.CharField(max_length=255, blank=False)
  leader = models.ForeignKey("Leader", related_name="projects")


class Enterprise(models.Model):
  name = models.CharField(max_length=255, blank=False, unique=True, verbose_name='エンタープライズ名')
  business_area = models.CharField(max_length=255, verbose_name='事業分野')
  founding_date = models.DateField()
 

class Leader(models.Model):
  enterprise = models.ForeignKey('Enterprise', on_delete=models.CASCADE, related_name='leaders', verbose_name='エンタープライズ')
  name = models.CharField(max_length=255, verbose_name='リーダー氏名')
  age = models.IntegerField(verbose_name="年齢")

条件をつけることが目的なので、意味不明な抽出条件ですが、以下のようにしてみました。

project:[Project] = Project.objects.filter(
    leader__age__lt=30,   # リーダーの年齢が40歳未満(lt=less then)
    enterprise__founding_date__gte= '2013-04-01'  # 創業日が2013年4月1日以降 (gte=greater than equal)
).order_by('leader__age').first()

まず、leaderもenterpriseも外部参照テーブル(Foreignkey)です。外部参照データを引っ張る場合、「__ (アンダースコア2つ)」でrelated_nameと参照先のフィールド名をつなぎます。

「lt」や「gte」は、それぞれ「less than」と「greater than equal」を表しており、「未満」と「以上」です。filter内では演算子が使えないのでこのように表現します。もちろん「lte」や「gt」という使い方も可能です。

抽出結果を並び替えたい時はorder_by()を使います。引数にフィールドを渡せばOKで、ここではただのフィールドではなくまた外部参照テーブルを渡しています。この場合でも「__」で繋げばOKです。

最後のfirst()は、先頭の1レコードのみを抽出します。


色んな条件の付け方がありますね。

ここまでお読みいただきありがとうございました!!

この記事が気に入ったらサポートをしてみませんか?