允许用户使用GAE匿名投一票

2024-04-26 10:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于投票的GAE应用程序,每个投票者通过电子邮件发送一个唯一的密钥,然后使用该密钥在网页上投票。我要确保每个投票者只能投一张票,而且投票是匿名的。在

我有一个带有属性has_votedVoter类和一个具有投票属性的Vote类。我希望投票是匿名的,所以我不想一个成为另一个的父母。在

我试着用一个事务来更新这两者,例如

def put_vote_transaction(vkey, vote):
    voter = Voter.get(vkey)
    if voter.has_voted:
        return False
    else:
        voter.has_voted = True
        db.put([voter, vote])
        return True

但这不起作用,因为选民和选票是在不同的实体组。在

我怎么能保证每一个投票者只能投一张?在


Tags: true应用程序return属性put密钥投票has
2条回答

正如您所观察到的,由于votervote位于不同的实体组中,因此不能在同一事务中更新它们。但是,您可以更新事务中的voter(正如您现在所做的那样),并将它们的vote记录在与该事务关联的transactional task中。在

您可以在为投票者创建投票项目时将其分配给他们,以便稍后在投票时“花费”。您可以使用一个属性来链接votes->;votes和votes->;thingToVoteOn(多态性)来解决事务问题。我将试着举例说明:

如果你的投票模式是:

Vote(db.Model):
    assigned_to = db.ReferenceProperty(collection_name='votes')

假设你投票的项目有其他模型,比如:

^{pr2}$

如果你第一次创建一个投票者,你给他们分配了一张选票

Voter(db.Model):
    # your voter properties

voter = Voter()
voter.put()
vote_to_spend = Vote()
vote_to_spend.assigned_to = voter()
vote_to_spend.put()

然后,投票人可以通过将投票重新分配给他们所投票的实体来“花费”该投票:

^{4}$

一旦投票被“cast”,它将不再被分配给投票者(因此是完全匿名的),并且它总是发生在同一个事务中,因为它在投票时只存储了一个实体(Vote)。在

相关问题 更多 >