ListPropertyでチクショウ

ListPropertyで要素を持たないデータを取得ってできないのかな・・・

こういうモデルがあったとする。

  • models.py
# -*- coding: utf-8 -*-
from django.utils.translation import ugettext_lazy as _
from google.appengine.ext import db

class Memo(db.Model):
    label  = db.StringListProperty()
    number = db.ListProperty()

入ってるデータが以下の状態だったとする

  • views.py
data = Memo.all()
for value in data :
    print value
# 結果
# Memo(key_id=5L, label=[u'aa', u'bb', u'cc'], number=[1L, 2L, 3L, 4L])
# Memo(key_id=6L, label=[], number=[1L, 2L, 3L, 4L])
# Memo(key_id=7L, label=[u'aa', u'bb', u'cc'], number=[])
# Memo(key_id=8L, label=[], number=[])

さて実験

data = Memo.all().filter('label = ', 'aa')
# 結果
# Memo(key_id=5L, label=[u'aa', u'bb', u'cc'], number=[1L, 2L, 3L, 4L])
# Memo(key_id=7L, label=[u'aa', u'bb', u'cc'], number=[])

data = Memo.all().filter('number = ', 2)
# 結果
# Memo(key_id=5L, label=[u'aa', u'bb', u'cc'], number=[1L, 2L, 3L, 4L])
# Memo(key_id=6L, label=[], number=[1L, 2L, 3L, 4L])

data = Memo.all().filter('label > ', None)
# 結果
# Memo(key_id=5L, label=[u'aa', u'bb', u'cc'], number=[1L, 2L, 3L, 4L])
# Memo(key_id=7L, label=[u'aa', u'bb', u'cc'], number=[])

data = Memo.all().filter('number > ', None)
# 結果
# Memo(key_id=5L, label=[u'aa', u'bb', u'cc'], number=[1L, 2L, 3L, 4L])
# Memo(key_id=6L, label=[], number=[1L, 2L, 3L, 4L])

data = Memo.all().filter('label =', None)
# 結果 : 無し

data = Memo.all().filter('number = ', None)
# 結果 : 無し

というわけで、そもそも要素が無いものはフィルター通らないぽい。「filter('label > ', None)」これが通用したもんだから「filter('label = ', None)」が良きに計らってくれるかもと期待してしまった。

ListPropertyはNone型を格納できないみたいだし、じゃあ空状態はどうなってるのかと見てみると「[]」状態だったし。

結局、値が格納されているかを判断するフラグを持つようにしました。

ううう・・・ちくしょう・・・