データストアにあるデータから、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 か何かを持っていた方がいいのかもね。

はー色々分かってスッキリ