Zwischen Abfrage äquivalent zum App Engine-Datenspeicher?

Ich habe ein Modell mit IP-Adressbereichen, ähnlich dem folgenden:

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

In einer SQL-Datenbank kann ich Zeilen finden, die eine IP in einem bestimmten Bereich enthalten:

SELECT * FROM Country WHERE ipnum BETWEEN begin_ipnum AND end_ipnum

oder dieses

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

Leider erlaubt GQL nur Ungleichheitsfilter für eine Eigenschaft und unterstützt das @ nichBETWEEN Syntax. Wie kann ich das umgehen und eine entsprechende Abfrage in App Engine erstellen?

Auch kann einListProperty 'live' sein oder muss es berechnet werden, wenn der Datensatz erstellt wird?

Frage mit einem ersten Stich auf eine Lösung aktualisiert:

So basierend auf Davids Antwort unten und Artikeln wie diesen:

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

Ich versuche, meinem Modell ein benutzerdefiniertes Feld hinzuzufügen:

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)

Der Gedanke ist, dass ich nach dem Hinzufügen der benutzerdefinierten Eigenschaft mein Dataset einfach so importieren kann, wie es ist, und dann Abfragen basierend auf der ListProperty wie folgt ausführen kann:

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

Wenn ich versuche, neue Country-Objekte einzufügen, schlägt dies jedoch fehl, da der Name nicht erstellt werden kann:

...
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

Ich habe versucht, ein @ zu definierattr_name Methode für die neue Eigenschaft oder einfach @ setzself.name aber das scheint nicht zu helfen. Hoffnungslos hängen geblieben oder auf dem richtigen Weg?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage