Вы можете назначить элемент голосования избирателю, когда он будет создан для него, чтобы впоследствии «тратить» на его голосование. И вы могли бы использовать одно свойство, чтобы связать голоса-> избирателей и голосов-> thingToVoteOn (полиморфный), чтобы обойти проблемы транзакции. Я постараюсь проиллюстрировать:
Если ваша модель голосования была такой:
Vote(db.Model):
assigned_to = db.ReferenceProperty(collection_name='votes')
И при условии, что у вас есть другая модель для предмета, по которому вы голосуете, например:
ThingToVoteOn(db.Model):
pass
И если вы впервые создаете Избирателя, вы назначаете ему Голос
Voter(db.Model):
# your voter properties
voter = Voter()
voter.put()
vote_to_spend = Vote()
vote_to_spend.assigned_to = voter()
vote_to_spend.put()
Затем позже избиратель может «потратить» этот голос, переназначив его лицу, за которое он голосует:
vote = voter.vote
vote.assigned_to = thing_you_vote_on
vote.put()
Как только голос «отдан», он больше не будет назначен избирателю (поэтому он полностью анонимный), и он всегда происходит в рамках одной и той же транзакции, поскольку он представляет собой только одну сущность (Vote
). хранится во время голосования.