Между запросом, эквивалентным на хранилище данных Механизма Приложения?

У меня есть модель, содержащая диапазоны IP-адресов, подобных этому:

class Country(db.Model):
  begin_ipnum = db.IntegerProperty()
  end_ipnum = db.IntegerProperty()

На базе данных SQL я смог бы найти строки, которые содержали IP в определенном диапазоне как это:

SELECT * FROM Country WHERE ipnum BETWEEN begin_ipnum AND end_ipnum

или это:

SELECT * FROM Country WHERE begin_ipnum < ipnum AND end_ipnum > ipnum

К сожалению, GQL только позволяет фильтры неравенства на одном свойстве и не поддерживает BETWEEN синтаксис. Как я могу работать вокруг этого и создать запрос, эквивалентный им на Механизме Приложения?

Кроме того, может a ListProperty будьте 'живы', или это должно быть вычислено, когда запись создается?

вопрос обновил с первым ударом в решении:

Таким образом на основе ответа David ниже и статей, таких как они:

http://appengine-cookbook.appspot.com/recipe/custom-model-properties-are-cute/

Я пытаюсь добавить пользовательское поле к своей модели как так:

class IpRangeProperty(db.Property):
  def __init__(self, begin=None, end=None, **kwargs):
    if not isinstance(begin, db.IntegerProperty) or not isinstance(end, db.IntegerProperty):
        raise TypeError('Begin and End must be Integers.')
    self.begin = begin
    self.end = end
    super(IpRangeProperty, self).__init__(self.begin, self.end, **kwargs)

  def get_value_for_datastore(self, model_instance):
    begin = self.begin.get_value_for_datastore(model_instance)
    end = self.end.get_value_for_datastore(model_instance)
    if begin is not None and end is not None:
      return range(begin, end)

class Country(db.Model):
  begin_ipnum = db.IntegerProperty()
  end_ipnum = db.IntegerProperty()
  ip_range = IpRangeProperty(begin=begin_ipnum, end=end_ipnum)

Взгляды состоят в том что после того, как я добавляю пользовательское свойство, я могу просто импортировать свой набор данных, как и затем выполнение запросов на на основе ListProperty как так:

q = Country.gql('WHERE ip_range = :1', my_num_ipaddress)

То, когда я пытаюсь вставить новую Страну, возражает, что это перестало работать хотя, жалуясь на неспособность создать имя:

...
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/db/__init__.py", line 619, in _attr_name
return '_' + self.name
TypeError: cannot concatenate 'str' and 'IntegerProperty' objects

Я пытался определить attr_name метод для нового свойства или просто установки self.name но это, кажется, не помогает. Безнадежно застрявший или хождение в правильном направлении?

5
задан tijs 27 July 2010 в 12:30
поделиться