2014-10-24 8 views
1

Я хочу создать только 1 объект DailyPost. Но когда я делаю два запроса одновременно, есть два объекта DailyPost.как ограничить число сущностей. google app engine

Как я могу это ограничить?

Окружающая среда:

Google App Engine

выполнения: python27

хранилищу: ОПРС

def get_today(): 
    return datetime.datetime.combine(datetime.date.today(), datetime.time()) 

class DailyPost(ndb.Model): 
    user = ndb.KeyProperty(kind=User) 
    content = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add=True) 

class GetOrCreateHandler(webapp2.RequestHandler): 
    def get(self): 
    user = session.get_user() # user from session (pseudo code) 
    post = DailyPost.query(DailyPost.created >= get_today(), 
          DailyPost.user==user.key).get() 
    if not post: 
     # Delay to test. (or time.sleep) 
     for i in range(30000): 
     print 1 
     post = DailyPost(content='some text..', user=user.key) 
     post.put() 

    self.response.write(post.content) 

ответ

0

Просто используйте уникальное значение для каждого дня в качестве ключа с get_or_insert методом:

import datetime 

class DailyPost(ndb.Model): 
    user = ndb.KeyProperty(kind=User) 
    content = ndb.StringProperty() 
    #created = ndb.DateTimeProperty(auto_now_add=True) 

class GetOrCreateHandler(webapp2.RequestHandler): 
    def get(self): 
    user = self.session.get_user() # user from session (pseudo code) 
    _id = '%s.%s' % (user.id, datetime.date.today().strftime('%s')) 
    DailyPost.get_or_insert(_id, user=user, content='bla') 
    self.response.write(post.content) 
+0

Спасибо. Но мне нужен пост для каждого пользователя. 'DailyPost.query (DailyPost.created> = get_today(), DailyPost.user == user.key) .get()' –

+0

Просто введите идентификатор пользователя в ключе до отметки времени. Посмотрите обновленный ответ. –

+0

Я думаю, что я должен использовать ndb.transactional с запросом предка. В любом случае, спасибо. –

Смежные вопросы