VoteHandler в Google App Engine

Я пытаюсь ограничить эту функцию пользователя только одним голосом за изображение. Однако в настоящее время он пропускает все голоса. Если я изменю «if existing_vote! = 0:» на «if existing_vote == 0:», голоса не пройдут. Мысли?

класс VoteHandler (webapp.RequestHandler):

def get(self):
    #See if logged in
    self.Session = Session()
    if not 'userkey' in self.Session:
        doRender(
            self,
            'base/index.html',
            {'error' : 'Please login to vote'})
        return

    #If user hasn't voted - if user doesn't have a vote on that image object
    key = self.request.get('photo_id')
    vurl = models.Image.get_by_id(int(key))

    #pull current site vote total & add 1

    existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl).count()

    if existing_vote != 0:
        self.redirect('/', { })
    else:    
        newvote = models.Vote(user=self.Session['userkey'], url=vurl)
        vurl.votes += 1
        vurl.put()
        logging.info('Adding a vote')

        #Create a new Vote object
        newvote = models.Vote(user=self.Session['userkey'], url=vurl)
        newvote.put()    
        self.redirect('/', { })

Для моделей:

класс User (db.Model):

account = db.StringProperty ()

пароль = db.StringProperty ()

name = db.StringProperty ()

created = db.DateTimeProperty (auto_now = True)

изображение класса (db.Model):

user = db.ReferenceProperty (Пользователь)

photo_key = db.BlobProperty ()

website = db.StringProperty ()

текст = db.StringProperty ()

created = db.DateTimeProperty (auto_now = True)

голосов = db.IntegerProperty (по умолчанию = 1)

Голосование класса (db.Model):

user = db.ReferenceProperty (User) # Посмотрите, проголосовали ли еще на этом сайте

photo = db.ReferenceProperty (Image) # Чтобы проголосовать за правильный URL

upvote = db.IntegerProperty (по умолчанию = 1)

created = db.DateTimeProperty (auto_now = True)


person Emile    schedule 01.09.2010    source источник
comment
Чему равен счет? Добавьте оператор ведения журнала и попытайтесь выяснить, что он на самом деле возвращает: existing_vote = models.Vote.all (). Filter ('user =', self.Session ['userkey']). Filter ('photo =', vurl ) .count () Лучшей реализацией было бы создание класса голосования в качестве дочернего объекта пользователя в группе сущностей с photoId в качестве ключа. Не по теме, но не могли бы вы спросить, почему вы реализовали свой собственный класс User вместо использования учетных записей Google или OpenID?   -  person Ikai Lan    schedule 02.09.2010
comment
1. Журналы показывают existing_vote = 0 2. n00b здесь, и уходил из учебника в книге, которая создала класс User ...   -  person Emile    schedule 02.09.2010


Ответы (2)


Похоже, ваш фильтр по пользователю стирает все существующие голоса, то есть равенство там никогда не выполняется. И действительно, я не уверен, как я смогу должным образом выполнить проверку на равенство для ссылки. Почему бы не изменить

user = db.ReferenceProperty(User) #See if voted on this site yet

to, e.g.,

useraccount = db.StringProperty()  # account of user who cast this vote

Тогда сравнение превращается в простую проверку равенства между строками и обязательно работает без каких-либо осложнений - простота обычно предпочтительнее, когда это возможно.

person Alex Martelli    schedule 02.09.2010
comment
Разве нельзя использовать сегментированный счетчик? Я что-то упускаю? - person Matthew H; 02.09.2010
comment
@Matt, сегментированный счетчик, который считает только до 0 или 1 и вводится каждой парой пользователя и изображения ...? Мне кажется странным - постараюсь опубликовать разъясняющий ответ, потому что я просто не могу понять смысл комментария, а комментарии слишком ограничены, чтобы вы могли достаточно подробно рассказать об этом, я боюсь. - person Alex Martelli; 02.09.2010
comment
@Matt @Alex - спасибо за ответы. Вот что у меня получилось вчера вечером: gist.github.com/562252. И я не знаком с сегментированным счетчиком, проверяю это сейчас - person Emile; 02.09.2010

В этой строке здесь:

existing_vote = models.Vote.all().filter('user=', self.Session['userkey']).filter('photo=',vurl).count()

Вам нужно поставить пробел между «фото» и «=» в фильтрах - в противном случае он пытается отфильтровать свойство с именем «фото =». Это должно работать:

existing_vote = models.Vote.all().filter('user =', self.Session['userkey']).filter('photo =',vurl).count()
person Nick Johnson    schedule 02.09.2010
comment
это определенно было частью этого. Удивительно, но да, пробелы были частью проблемы - person Emile; 02.09.2010
comment
Это определенно ошибка, но мы не можем ее изменить, не нарушив при этом существующие приложения. Это имеет смысл, если вы поймете, что «foo =» - допустимое имя свойства. Вы можете продолжать использовать свойства ссылки, хотя - ‹, = и› являются допустимыми операциями со свойством ссылки. - person Nick Johnson; 02.09.2010