コード例 #1
0
 def fanout_to_followers(cls, tweet):
     newsfeeds = [
         NewsFeed(user=follower, tweet=tweet)
         for follower in FriendshipService.get_followers(tweet.user)
     ]
     newsfeeds.append(NewsFeed(user=tweet.user, tweet=tweet))
     NewsFeed.objects.bulk_create(newsfeeds)
コード例 #2
0
ファイル: services.py プロジェクト: Olililili/django-twitter
    def fanout_to_followers(cls, tweet):
        # 错误的方法
        # 不可以将数据库操作放在 for 循环里面,效率会非常低
        # for follower in FriendshipService.get_followers(tweet.user):
        #     NewsFeed.objects.create(
        #         user=follower,
        #         tweet=tweet,
        #     )

        # 正确的方法:使用 bulk_create,会把 insert 语句合成一条
        print(FriendshipService.get_followers(tweet.user))
        newsfeeds = [
            NewsFeed(user=follower, tweet=tweet)
            for follower in FriendshipService.get_followers(tweet.user)
        ]
        newsfeeds.append(NewsFeed(user=tweet.user, tweet=tweet))
        NewsFeed.objects.bulk_create(newsfeeds)
コード例 #3
0
    def fanout_to_followers(cls, tweet):
        newsfeeds = [
            NewsFeed(user=follower, tweet=tweet)
            for follower in FriendshipService.get_followers(tweet.user)
        ]
        newsfeeds.append(NewsFeed(user=tweet.user, tweet=tweet))
        NewsFeed.objects.bulk_create(newsfeeds)

        # bulk create 不会触发 post_save 的 signal,所以需要手动 push 到 cache 里
        for newsfeed in newsfeeds:
            cls.push_newsfeed_to_cache(newsfeed)
コード例 #4
0
 def fan_out_to_followers(cls, tweet):
     followers = FriendshipService.get_followers(tweet.user)
     newsfeeds = [
         NewsFeed(tweet=tweet, user=follower, created_at=tweet.created_at)
         for follower in followers
     ]
     #should be able to see own posts
     newsfeeds.append(
         NewsFeed(tweet=tweet, user=tweet.user,
                  created_at=tweet.created_at))
     NewsFeed.objects.bulk_create(newsfeeds)
コード例 #5
0
ファイル: services.py プロジェクト: hanyuanh/my-twitter
    def fanout_to_followers(cls, tweet):
        # Wrong way to do the creation:
        # cannot put database op in a for loop, very inefficient
        # for follower in FriendshipService.get_followers(tweet.user):
        #     NewsFeed.objects.create(
        #         user=follower,
        #         tweet=tweet,
        #     )

        # 正确的方法:使用 bulk_create,会把 insert 语句合成一条
        # Right way: use bulk_create, which combines all insert SQLs into one
        # line
        newsfeeds = [
            # Request for update will not be made until .save()
            NewsFeed(user=follower, tweet=tweet)
            for follower in FriendshipService.get_followers(tweet.user)
        ]
        newsfeeds.append(NewsFeed(user=tweet.user, tweet=tweet))
        NewsFeed.objects.bulk_create(newsfeeds)  # create newsfeeds in a batch
コード例 #6
0
    def fanout_to_followers(cls, tweet):
        # 错误的方法
        # 在production 是不允许for + query的 效率很低
        # 原因是 web server和 db通常不在一台机器上 多次查询会产生大量延迟 (round trip多 -- 用户信息的验证)

        # for follower in FriendshipService.get_followers(tweet.user):
        #     NewsFeed.objects.create(
        #         user=follower,
        #         tweet=tweet,
        #     )

        # 正确的方法: 使用bulk_create, 会把insert语句合成一条
        newsfeeds = [
            NewsFeed(user=follower, tweet=tweet)  # 由于此处没有.save 所以不会产生数据库存储请求操作
            for follower in FriendshipService.get_followers(tweet.user)
        ]
        # 由于用户自己不是自己的follower
        # 此处是把用户本身也加入到follower中使得自己也可以看到自己的newsfeed
        newsfeeds.append(NewsFeed(user=tweet.user, tweet=tweet))
        NewsFeed.objects.bulk_create(newsfeeds)