[英]Random match-up with Python and Google App Engine
I am building a website where two music videos are randomly chosen from a database and go head-to-head for voting. 我正在建立一个网站,从数据库中随机选择两个音乐视频,并进行直接投票。 I need an algorithm that will continue picking unique match-ups for a user excluding match-ups they have had in the past, but with replacing videos for new match-ups. 我需要一种算法,该算法将继续为用户选择唯一的匹配,但不包括他们过去的匹配,而是替换视频以创建新的匹配。 You can view a sample of the page here: http://10.showtownmvp.appspot.com/ 您可以在此处查看页面示例: http : //10.showtownmvp.appspot.com/
I am running this on Google App Engine - Python, and have a voting table and videos table that stores the results. 我正在Google App Engine-Python上运行此程序,并具有一个投票表和视频表来存储结果。 I would like to keep it as random as possible and avoid multiple queries, so if you have suggestions on how to model this in NDB or have a good algorithm, I would appreciate your help! 我想尽可能地保持随机性,并避免多次查询,因此,如果您对如何在NDB中进行建模有什么建议或有一个好的算法,我将不胜感激!
My solution to this problem was to query all videos from the datastore and randomly select one. 我针对此问题的解决方案是查询数据存储区中的所有视频并随机选择一个。 I also ran a query for past votes / matchups for the user and converted this to a list so I could manipulate it without running several queries. 我还对用户的过去投票/对决进行了查询,并将其转换为列表,这样我就可以在不运行多个查询的情况下进行操作。 Using the random video, I used a while loop to find a second video that was not in the previous matchup list. 使用随机视频,我使用了while循环来查找不在上一个比赛列表中的第二个视频。 If no video was found, the program would remove the random choice from the video list, then select a new sample and run the search again. 如果未找到视频,则程序将从视频列表中删除随机选择,然后选择一个新样本并再次运行搜索。 The code is below: 代码如下:
class MainHandler(views.Template):
def post(self):
# NOTE: we are posting genre and state.
user = self.user_check()
self.videos = models.videos.Videos.fetch_featured()
try:
random.sample(self.videos,2)
if user:
self.user_votes = models.voting.Voting.query_by_user(user.key)
if self.user_votes != None:
self.user_votes = [[x.video_one,x.video_two] for x in self.user_votes]
page_vids = False
while page_vids == False and len(self.videos)>1:
rand_vid = random.choice(self.videos)
page_vids = self.find_match(rand_vid)
self.videos.remove(rand_vid)
else:
page_vids = random.sample(self.videos,2)
else:
page_vids = random.sample(self.videos,2)
except:
page_vids = None
def find_match(self, rand_vid):
i =0
while i < len(self.videos):
if rand_vid.key != self.videos[i].key and ([rand_vid.key,self.videos[i].key] not in self.user_votes and [self.videos[i].key, rand_vid.key] not in self.user_votes):
return [rand_vid,self.videos[i]]
i+=1
return False
class Videos(ndb.Model):
acc_key = ndb.KeyProperty()
musician_key = ndb.KeyProperty()
musician_name = ndb.StringProperty()
embed_link = ndb.StringProperty()
genre_tag = ndb.StringProperty()
video_title = ndb.StringProperty()
featured = ndb.BooleanProperty(default = False)
likes_count = ndb.IntegerProperty()
video_added = ndb.DateTimeProperty(auto_now_add = True)
@classmethod
def query_by_account(cls, acc_key):
return cls.query(cls.acc_key == acc_key).fetch()
@classmethod
def fetch_featured(cls):
return cls.query(cls.featured == True).fetch(100)
class Voting(ndb.Model):
voter_acc_key = ndb.KeyProperty()
voter_type = ndb.StringProperty()
video_one = ndb.KeyProperty()
video_one_artist_key = ndb.KeyProperty()
video_two = ndb.KeyProperty()
video_two_artist_key = ndb.KeyProperty()
voter_choice = ndb.KeyProperty()
video_set_check = ndb.KeyProperty(repeated = True)
voter_ip = ndb.StringProperty()
vote_time = ndb.DateTimeProperty(auto_now_add = True)
@classmethod
def query_by_user(cls, acc_key):
return cls.query(cls.voter_acc_key == acc_key).fetch(2000)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.