我有一个用于投票的GAE应用程序,每个投票者通过电子邮件发送一个唯一的密钥,然后使用该密钥在网页上投票。我要确保每个投票者只能投一张票,而且投票是匿名的。在
我有一个带有属性has_voted
的Voter
类和一个具有投票属性的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
但这不起作用,因为选民和选票是在不同的实体组。在
我怎么能保证每一个投票者只能投一张?在
正如您所观察到的,由于
voter
和vote
位于不同的实体组中,因此不能在同一事务中更新它们。但是,您可以更新事务中的voter
(正如您现在所做的那样),并将它们的vote
记录在与该事务关联的transactional task中。在您可以在为投票者创建投票项目时将其分配给他们,以便稍后在投票时“花费”。您可以使用一个属性来链接votes->;votes和votes->;thingToVoteOn(多态性)来解决事务问题。我将试着举例说明:
如果你的投票模式是:
假设你投票的项目有其他模型,比如:
^{pr2}$如果你第一次创建一个投票者,你给他们分配了一张选票
然后,投票人可以通过将投票重新分配给他们所投票的实体来“花费”该投票:
^{4}$一旦投票被“cast”,它将不再被分配给投票者(因此是完全匿名的),并且它总是发生在同一个事务中,因为它在投票时只存储了一个实体(
Vote
)。在相关问题 更多 >
编程相关推荐