ランダムおすすめ記事

ホームページ作りました

python,djangoでデータを表示する際にフィルターをかけてみよう

djangoでは以下のように記載するとモデルのデータがテンプレートに渡されます。

    context = {
    'キー名': モデル名.objects.all()
    }
    return render(request, 'アプリケーション名/html名.html', context)


でも状況によっては全ては表示したくないということもあるはず。 そんな時はこう書き換えます。

    context = {
    'キー名': モデル名.objects.filter(フィルターをかけたい条件)
    }
    return render(request, 'アプリケーション名/html名.html', context)


僕の場合はプライマリーキーと紐づいたモデルのみを出力したい!という時にfilterをかけるパターンしか作ったことはないのですが、その場合こうなります。

    context = {
        'キー名':モデル名.objects.filter(pk=pk),
    }


分かりにくいですね。全容を書きましょう。

def 関数名(request, pk):
    context = {
        'キー名':モデル名.objects.filter(pk=pk),
    }
    return render(request, 'アプリケーション名/使用したいhtml名.html', context)

(request,pk)部分がurl部分に表示されているプライマリーキー。 それを(pk=pk)で代入します。
ポイントはpkの部分でurls.pyの部分に

path('<int:pk>/', 使用する関数, 名前'),

と記載するとモデルのプライマリーキーごとにurlに数字があてがわれるので、urlに記載された数値とモデルが一つずつ持っているプライマリーキーが一致したものだけが表示されるようになります。
ちなみに以下のように書くと空欄の場合にfilterが発動して弾いてくれます。

.filter(フィルターをかけたい条件).exclude(任意の名前__exact=""),



ちなみにdjagoチュートリアルを見ているとこんな記載があります。 https://docs.djangoproject.com/ja/2.1/intro/tutorial04/ html部分なんですが、

{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}

以前フィルター関係で苦労した部分だったんですが、これはquestionに紐づいた、choiceをall表示するって意味です。(ルー語)

questionに紐づいたchoiceとはmodels.pyの

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

この部分のことで

question = models.ForeignKey(Question, on_delete=models.CASCADE)

これでclass ChoiceはQuestionに紐づくことができます。


こうすると紐づかれるクラス名(小文字).紐づくクラス名(小文字)_set.all

question.choice_set.all

という書き方でQuestionに紐づいたChoiceがすべて出力されるようになるのです。 もちろん<int:pk>部分が無ければ普通に全部表示されるだけなので特に意味はないですがこのプライマリーキーのQuesionに紐づくChoiceだけを表示する。 というときにはこう書けるのです。