Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

django備忘録26 QuerySet Basics

参照サイト

QuerySet API reference | Django documentation | Django

この辺のquerysetの使い方も参考になるとのこと。

Coding for Entrepreneurs

DjangoのQuerySet の基本を学ぶ

  • 多分、querysetは、model,viewとかで使われるんだろうな。

  • まず、試しに、querysetの動作を確認してみる。

views.py

print (SignUp.objects.all())

objectsは、多分、model にもともと備わってる関数。all()はすべて取得。

これで、ターミナルに表示される。

  • 次に、SignUpのobjectsをforを使って取り出してみる。
        for instance in SignUp.objects.all():
            print (instance)

これで、ターミナルに、SignUpのemailが出力される。ただ、他の項目は出力されない。ここはキーもしくは、strだけなのか。。。よくわからん。

とにかくobjectsは、1つの塊を取り出すとイメージしておこう。

  • 次に、instanceをキーにして?、他の項目も取り出す。
        for instance in SignUp.objects.all():
            print (i)
            print (instance.full_name)
            i += 1

これで、instanceから、full_nameを取り出せる。

  • querysetをcontextに渡して、homeに表示させてみる。

views.py

...
        queryset = SignUp.objects.all()

        context = {
            "queryset":queryset
        }
...

これで、querysetを渡せる。

  • home.html で、受け取ったquerysetは、django templateで、for構文を使ってリスト表示ができたりする。 例えば、以下のような感じ。

home.html

{% for instance in queryset %}
{{ instance.full_name }}
</br>
{% endfor %}

ここで注意するのは、{{}} と{%%}の使い分け。

  • さらに、表示したリストをテーブルタグでスタイリッシュにできる。

と、
も忘れずに。

    {% if queryset %}
        <h2>これはスタッフ用の画面です!</h2>
        <table class='table'>
        {% for instance in queryset %}
            <tr><td>{{ instance }}</td><td>{{ instance.full_name }}</td><td>{{ instance.timestamp }}</td></tr>
        {% endfor %}
        </table>
    {% endif %}

  • timestampは、timesinceとかいうのも使ったりできる。

'{{ instance.timestamp|timesince }}' こういう感じのコードで、現時点からどれくらい経過しているのかが、表示できる。便利!

  • views.pyの、querysetの箇所を、SignUp.objects.all().order_by('-timestamp') とかで、timestampを昇順に変更できる。

  • さらに、queryset filterを使ってみる。

filter() と、icontains(ダブルアンダースコア) を使って、 filter(フィールド名icontains="フィルター文字列") で表示可能。

queryset = SignUp.objects.all().order_by('-timestamp').filter(full_name__icontains="Justin")

  • filterは、その他にも, __iexact() などが使えたりする。iexactは、完全一致。

{{ forloop.counter }} とかで、forloopの数を数えられる。

  • for文の中に条件分岐を入れることも可。

            <table class='table'>
          {% for instance in queryset %}
              <tr><td>{{ forloop.counter }}</td><td>{{ instance.email }}</td><td>{{ instance.full_name }}</td><td>{{ instance.timestamp|timesince }}前</td></tr>
              {% if instance.email == "savetest2@eddc.edu" %}
                  <tr><td>is equal</td></tr>
              {% endif %}
          {% endfor %}
          </table>

  • かなり便利なことがわかった!