データストアにあるデータから、Noneのものを取得またはNone以外を取得、そして昇順降順でソートする
こんなクラス(Store)があったとして・・・
- models.py
# -*- coding: utf-8 -*- from django.utils.translation import ugettext_lazy as _ from google.appengine.ext import db class Store(db.Model): name = db.StringProperty() phone = db.StringProperty() email = db.EmailProperty()
そこから name が None になっている情報を取得したいなら filter('name =' None) とするだけ。逆に name が None ではない情報を取得したいなら filter('name >' None) とするだけ。
ひがやすをさんの記事を参考にしました。Bigtableで!=nullが使える - ひがやすを blog
- views.py
from XXXXX.models Store def getStore(request): # 名無し情報 no_name_store = Store.all().filter('name =', None) # 名有り情報 has_name_store = Store.all().filter('name >', None)
よし!取りたいように取れた。次に、ソートを試す。
- views.py
from XXXXX.models Store def getStore(request): # 全データの確認 sotre = Store.all() # 結果。このデータでいろいろ試す。 # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None)
まずは name でソート。
- views.py
from XXXXX.models Store def getStore(request): # 昇順 store = Store.all().order('name') # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None) # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None) # 降順 store = Store.all().order('-name') # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None)
ふむ。では次に phone でソート。
- views.py
from XXXXX.models Store def getStore(request): # 昇順 store = Store.all().order('phone') # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None) # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None) # 降順 store = Store.all().order('-phone') # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None) # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None)
ほほう。最後に、どのデータにも値がセットされていない email でソート。
- views.py
from XXXXX.models Store def getStore(request): # 昇順 store = Store.all().order('email') # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None) # 降順 store = Store.all().order('-email') # Store(key_id=1L, name=u'a1', phone=u'0311112222', email=None) # Store(key_id=2L, name=u'a2', phone=None, email=None) # Store(key_id=3L, name=None, phone=None, email=None) # Store(key_id=4L, name=u'a4', phone=None, email=None) # Store(key_id=5L, name=u'\u3042\u3042\u3042', phone=None, email=None) # Store(key_id=6L, name=u'a6', phone=None, email=None) # Store(key_id=7L, name=u'aaa', phone=None, email=None) # Store(key_id=8L, name=u'bbb', phone=None, email=None) # Store(key_id=9L, name=None, phone=None, email=None) # Store(key_id=10L, name=u'\u3042\u3044\u3046\u3048\u304a', phone=None, email=None) # Store(key_id=11L, name=None, phone=u'0311112222', email=None)
演算子を見れば None は小さい扱いだとは思ったが、以前 MySQL で NULL を扱った時に NULLを含めたデータをソートすると、昇順でも降順でも必ずNULLが先頭に来るというなんとも言えない事があったので、念のため確認した。また、ソート時に比較した結果の値が同値となった場合は、キーの昇順つまりデータをセットした順番で並ぶ。
・・・というか、このキーでソートって無いのかな。データを入れた順序でどうのこうのしたいなら、datetime か何かを持っていた方がいいのかもね。
はー色々分かってスッキリ