更新0
我的def post()
代码发生了巨大变化,原因是它基于数字形式,包括复选框和文本输入字段,而不仅仅是文本输入字段,这是当前设计更像纸张。但是,因此我有其他问题可以通过提出的解决方案之一解决,但我不能完全遵循提出的解决方案,所以让我试着解释新的设计和问题。
较小的问题是我的实现效率低下,因为在def post()
我为每个输入时隙创建了一个不同的name
,这是一个长字符串<courtname><timeslotstarthour><timeslotstartminute>
。在我的代码中,name
在嵌套的for
循环中使用以下代码段读取[非常低效,我想]。
tempreservation=courtname+str(time[0])+str(time[1])
name = self.request.get('tempreservation',None)
更严重的直接问题是我的def post()
代码从未被读过,我无法弄清楚为什么(也许它之前没有被读过,但我还没有测试过那么远)。我想知道问题是不是现在我想要帖子和得到“完成”同样的方式。下面的第一行是post(),第二行是get()。
return webapp2.redirect("/read/%s" % location_id)
self.render_template('read.html', {'courts': courts,'location': location, ... etc ...}
我的新帖子()如下。请注意我在代码中留下了logging.info
,看看我是否到过那里。
class MainPageCourt(BaseHandler):
def post(self, location_id):
logging.info("in MainPageCourt post ")
startTime = self.request.get('startTime')
endTime = self.request.get('endTime')
day = self.request.get('day')
weekday = self.request.get('weekday')
nowweekday = self.request.get('nowweekday')
year = self.request.get('year')
month = self.request.get('month')
nowmonth = self.request.get('nowmonth')
courtnames = self.request.get_all('court')
for c in courtnames:
logging.info("courtname: %s " % c)
times=intervals(startTime,endTime)
for courtname in courtnames:
for time in times:
tempreservation=courtname+str(time[0])+str(time[1])
name = self.request.get('tempreservation',None)
if name:
iden = courtname
court = db.Key.from_path('Locations',location_id,'Courts', iden)
reservation = Reservations(parent=court)
reservation.name = name
reservation.starttime = time
reservation.year = year
reservation.nowmonth = int(nowmonth)
reservation.day = int(day)
reservation.nowweekday = int(nowweekday)
reservation.put()
return webapp2.redirect("/read/%s" % location_id)
最后,我想通过将数据存储区中现有的预订数据与隐含的新预订进行比较,将检查/验证添加到上述get()代码中,然后发出警报,告知用户任何可能出现的问题。地址。
我也很感激对这两个问题的任何评论。
更新结束0
我的应用程序适用于社区网球场。我想用一张模仿纸张的在线数码表替换纸质报名表。尽管似乎不太可能出现两次网球预约相互冲突的“交易”冲突。那么,我如何让第二个预约制定者领先于冲突,同时也让成功的一方有机会改变她的约会,就像她在纸上一样(用橡皮擦)。
每半小时是表单上的一个时间段。人们通常在“提交”之前一次注册多个半小时。
所以在我循环的代码中我做了一个get_all。如果任何获得成功,我想让用户控制是否接受put()。我仍然认为put()将是全部或全部,而不是选择性。
所以我的问题是,我是否需要让部分代码使用明确的“事务”?
class MainPageCourt(BaseHandler):
def post(self, location_id):
reservations = self.request.get_all('reservations')
day = self.request.get('day')
weekday = self.request.get('weekday')
nowweekday = self.request.get('nowweekday')
year = self.request.get('year')
month = self.request.get('month')
nowmonth = self.request.get('nowmonth')
if not reservations:
for r in reservations:
r=r.split()
iden = r[0]
temp = iden+' '+r[1]+' '+r[2]
court = db.Key.from_path('Locations',location_id,'Courts', iden)
reservation = Reservations(parent=court)
reservation.starttime = [int(r[1]),int(r[2])]
reservation.year = int(r[3])
reservation.nowmonth = int(r[4])
reservation.day = int(r[5])
reservation.nowweekday = int(nowweekday)
reservation.name = self.request.get(temp)
reservation.put()
return webapp2.redirect("/read/%s" % location_id)
else:
... this important code is not written, pending ...
return webapp2.redirect("/adjust/%s" % location_id)
答案 0 :(得分:1)
答案 1 :(得分:0)
您可以检查给定Court
中时段的可用性,并仅在Reservations
不发生冲突时写入相应的stat_time
子实体。
以下是使用祖先查询进行1次预约的方法:
@ndb.transactional
def make_reservation(court_id, start_time):
court = Court(id=court_id)
existing = Reservation.query(Reservation.start_time == start_time,
ancestor=court.key).fetch(2, keys_only=True)
if len(existing):
return False, existing[0]
return True, Reservation(start_time=start_time, parent=court.key).put()
另外,如果您将插槽部分设为预留ID,则可以删除查询并构建预留实体密钥以检查它们是否已存在:
@ndb.transactional
def make_reservations(court_id, slots):
court = Court(id=court_id)
rs = [Reservation(id=s, parent=court.key) for s in slots]
existing = ndb.get_multi(r.key for r in rs)
if any(existing):
return False, existing
return True, ndb.put_multi(rs)
答案 2 :(得分:0)
我认为您应该始终使用交易,但我不认为您的问题最好通过交易解决。
我认为你应该实施一个两阶段预订系统 - 这是你在大多数购物袋和票务公司看到的。