मैं एक मॉडल आईपी पतों की श्रेणियों युक्त है यह करने के लिए, समान:ऐप इंजन डेटास्टोर पर समकक्ष क्वेरी के बीच?
SELECT * FROM Country WHERE ipnum BETWEEN begin_ipnum AND end_ipnum
:
class Country(db.Model):
begin_ipnum = db.IntegerProperty()
end_ipnum = db.IntegerProperty()
एक SQL डेटाबेस पर, मैं पंक्तियाँ जो इस तरह एक निश्चित सीमा में एक आईपी निहित खोजने के लिए सक्षम हो जाएगा
या इस:
SELECT * FROM Country WHERE begin_ipnum < ipnum AND end_ipnum > ipnum
दुःख की बात है GQL केवल असमानता फिल्टर एक संपत्ति पर अनुमति देता है, और BETWEEN
वाक्य रचना का समर्थन नहीं करता। मैं इसके आसपास कैसे काम कर सकता हूं और ऐप इंजन पर इनके बराबर एक क्वेरी कैसे बना सकता हूं?
इसके अलावा, ListProperty
'लाइव' हो सकता है या रिकॉर्ड होने पर इसे गणना की जानी चाहिए?
सवाल एक समाधान पर एक प्रथम चाकू के साथ अद्यतन:
तो इस प्रकार के नीचे डेविड के जवाब और लेख के आधार पर:
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)
सोच यह है कि मैं custo जोड़ने के बाद मीटर संपत्ति मैं सिर्फ मेरी डाटासेट आयात कर सकते हैं के रूप में और उसके बाद तो जैसे ListProperty के आधार पर क्वेरी चला:
q = Country.gql('WHERE ip_range = :1', my_num_ipaddress)
जब मैं नया देश वस्तुओं हालांकि इस विफल रहता है सम्मिलित करने के लिए प्रयास करते हैं, नाम बनाने में सक्षम नहीं होने के बारे में complaning :
...
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
की स्थापना, लेकिन यह मदद करने के लिए प्रतीत नहीं होता है की कोशिश की। निराशाजनक ढंग से अटक या सही दिशा में शीर्षक?
दुर्भाग्य से dev_appserver प्रदर्शन करता है, दुर्भाग्य से: सही व्यवहार वर्तमान उत्पादन व्यवहार है। –
यह एक आशाजनक समाधान, अच्छा और सरल जैसा दिखता है। दस्तावेज़ों से ऐसा लगता है कि मैं एक कस्टम मॉडल प्रॉपर्टी बना सकता हूं जो start_ipnum और end_ipnum के मानों के आधार पर सूची मूल्य 'लाइव' की रिपोर्ट करता है। लेकिन जहां तक मैं कह सकता हूं कि मैं जीक्यूएल का उपयोग कर एक कस्टम प्रॉपर्टी से पूछताछ नहीं कर पाऊंगा। तो मैं ऑब्जेक्ट सृजन पर पहले श्रेणी के लिए एक गणना सूचीप्रॉपर्टी मान का प्रयास करूंगा। मैं रिपोर्ट करूंगा कि मैं कैसे किराया करता हूं! – tijs