dogrunjp
5/3/2014 - 7:41 AM

Google App EngineのDatastoreで、many-to-manyモデルで清水区のゴミの日のデータをの登録・取得するスクリプトを書いてみました。可燃ゴミ不燃ゴミ回収日ービン缶ゴミ回収日のリレーションをReferencePropertyなjoin tableで実装し

Google App EngineのDatastoreで、many-to-manyモデルで清水区のゴミの日のデータをの登録・取得するスクリプトを書いてみました。可燃ゴミ不燃ゴミ回収日ービン缶ゴミ回収日のリレーションをReferencePropertyなjoin tableで実装しています。

あ,15001,相生町,"WE,SA",4MO,浜田,20140402T000000,20140428T000000
.....
101,辻,20140401
102,浜田,20140401
103,辻,20140501
104,浜田,20140501
105,辻,20140602
106,浜田,20140602
107,辻,20140701
....
#model
class Smgomi(db.Model):
    initial = db.StringProperty()
    jichitai = db.StringProperty()
    kanen = db.StringProperty()
    funen = db.StringProperty()
    kstart = db.StringProperty()
    fstart = db.StringProperty()
    chomei = db.StringProperty()

class Smbinkan(db.Model):
    chomei = db.StringProperty()
    binkan = db.StringProperty()
    
#可燃ゴミ不燃ゴミ回収日ービン缶ゴミ野回収日のリレーションにjoin tableを使う
class Smgomibinkan(db.Model):
    smgomi = db.ReferenceProperty(Smgomi, collection_name='smbinkans')
    smbinkan = db.ReferenceProperty(Smbinkan, collection_name='smgomis')

##最初にビン缶の回収日のデータを登。CSVファイルをアップロードします。
class SmBinkanEntry(webapp2.RequestHandler):
    def get(self):
        if users.is_current_user_admin():
            template = JINJA_ENVIROMENT.get_template('upload.html')
            self.response.write(template.render())
        else:
            self.redirect(users.create_login_url(self.request.uri))
    def post(self):
        rawfile = self.request.get('file')
        csvfile = csv.reader(StringIO(rawfile),dialect='excel')
        for row in csvfile:
            Smbinkan(key_name=str(row[0]),
            chomei = unicode(row[1],'utf-8'),
            binkan=unicode(row[2],'utf-8')
            ).put()
        self.redirect(self.request.uri)

##次に可燃ゴミの回収日データとつjoin tableを登録。こちらもCSVをアップロード。
#可燃ゴミのデータから町名を抜き出しこの町名によるビン缶回収日のクエリを作成し
#join tableに可燃ゴミ不燃ゴミ回収日エンティティ追加のクエリとともに登録します。
class SmKFBEntry(webapp2.RedirectHandler):
    def get(self):
        if users.is_current_user_admin():
            template = JINJA_ENVIROMENT.get_template('upload.html')
            self.response.write(template.render())
        else:
            self.redirect(users.create_login_url(self.request.uri))
    def post(self):
        rawfile = self.request.get('file')
        csvfile = csv.reader(StringIO(rawfile),dialect='excel')
        for row in csvfile:
            cho = unicode(row[5], 'UTF-8')
            data_kanen = Smgomi(key_name = str(row[1]),
            initial=unicode(row[0],'UTF-8'),
            jichitai=unicode(row[2],'UTF-8'),
            kanen = unicode(row[3],'UTF-8'),
            funen = unicode(row[4],'UTF-8'),
            chomei = cho,
            kstart = unicode(row[6],'UTF-8'),
            fstart = unicode(row[7],'UTF-8')
            )
            data_kanen.put()
            data_binkans = db.Query(Smbinkan).filter('chomei =', cho).fetch(limit=12)
            for data_binkan in data_binkans:
                data_kanenbinkan = Smgomibinkan(smgomi=data_kanen, smbinkan=data_binkan)
                data_kanenbinkan.put()
                
        self.redirect(self.request.uri)

##key_nameで欲しい地区を指定し、ビン缶回収日を取得してみます。
class binkanHandler(webapp2.RequestHandler):
    def get(self):
        chiku_key = self.request.get('chiku')
        items = Smgomi.get_by_key_name(chiku_key)
        c =Smgomibinkan.all().filter('smgomi =', items).fetch(limit=12)
        for item in c:
            b = item.smbinkan.binkan
            print(b.encode('utf-8'))