Entre consultas equivalentes no armazenamento de dados do Google App Engine?
Eu tenho um modelo que contém intervalos de endereços IP, semelhante a este:
class Country(db.Model):
begin_ipnum = db.IntegerProperty()
end_ipnum = db.IntegerProperty()
Em um banco de dados SQL, eu seria capaz de encontrar linhas que continham um IP em um determinado intervalo como este:
SELECT * FROM Country WHERE ipnum BETWEEN begin_ipnum AND end_ipnum
ou isto:
SELECT * FROM Country WHERE begin_ipnum < ipnum AND end_ipnum > ipnum
Infelizmente, o GQL permite apenas filtros de desigualdade em uma propriedade e não suporta oBETWEEN
sintaxe. Como posso solucionar isso e criar uma consulta equivalente a essas no App Engine?
Além disso, podeListProperty
ser 'ao vivo' ou precisa ser calculado quando o registro é criado?
pergunta atualizada com uma primeira facada em uma solução:
Portanto, com base na resposta de David abaixo e em artigos como estes:
http://appengine-cookbook.appspot.com/recipe/custom-model-properties-are-cute/
Estou tentando adicionar um campo personalizado ao meu modelo da seguinte forma:
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)
O pensamento é que, depois de adicionar a propriedade personalizada, basta importar meu conjunto de dados como está e executar as consultas com base no ListProperty da seguinte maneira:
q = Country.gql('WHERE ip_range = :1', my_num_ipaddress)
No entanto, quando tento inserir novos objetos Country, isso falha, mas não é possível criar o nome:
...
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
Eu tentei definir umattr_name
método para a nova propriedade ou apenas definindoself.name
mas isso não parece ajudar. Irremediavelmente preso ou indo na direção certa?