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)
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)
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)
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)
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
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)