使用Python和Google App Engine随机匹配视频

67 阅读1分钟

我正在构建一个网站,其中从数据库中随机选择两个音乐视频进行投票。我希望得到一个算法,该算法将继续为用户挑选独特的匹配,排除他们过去拥有的匹配,但为新的匹配替换视频。

huake2_00017_.png 2、解决方案 我的解决方案是查询来自数据存储的所有视频并随机选择一个。我还查询了用户的过去投票/匹配,并将它转换为一个列表,以便在不运行多次查询的情况下对其进行操作。使用随机视频,我用一个循环找到一个不在前一匹配列表中的第二个视频。如果没有找到视频,程序会从视频列表中删除随机选项,然后选择一个新的样本并再次运行搜索。

代码示例:

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)