def query_by_user(user_id, hints=None, detail=False): """获取用户所有的订阅,支持增量查询 hints: T.list(T.dict(id=T.unionid, dt_updated=T.datetime)) """ detail = Detail.from_schema(detail, FeedDetailSchema) exclude_fields = [f'feed__{x}' for x in detail.exclude_fields] if not hints: q = UserFeed.objects.select_related('feed').filter(user_id=user_id) q = q.defer(*exclude_fields) union_feeds = UnionFeed._merge_user_feeds(list(q.all()), detail=detail) return len(union_feeds), union_feeds, [] hints = {x['id'].feed_id: x['dt_updated'] for x in hints} q = UserFeed.objects.filter(user_id=user_id).select_related('feed') q = q.only("id", 'feed_id', 'feed__dt_updated') user_feeds = list(q.all()) total = len(user_feeds) feed_ids = {user_feed.feed_id for user_feed in user_feeds} deteted_ids = [] for feed_id in set(hints) - feed_ids: deteted_ids.append(FeedUnionId(user_id, feed_id)) updates = [] for user_feed in user_feeds: feed_id = user_feed.feed_id dt_updated = user_feed.feed.dt_updated if feed_id not in hints or not dt_updated: updates.append(feed_id) elif dt_updated > hints[feed_id]: updates.append(feed_id) q = UserFeed.objects.select_related('feed')\ .filter(user_id=user_id, feed_id__in=updates) q = q.defer(*exclude_fields) union_feeds = UnionFeed._merge_user_feeds(list(q.all()), detail=detail) return total, union_feeds, deteted_ids
def to_dict(self, detail=False): ret = dict( id=self.id, user=dict(id=self.user_id), is_ready=self.is_ready, url=self.url, is_from_bookmark=self.is_from_bookmark, status=self.status, dt_created=self.dt_created, dt_updated=self.dt_updated, feed_unionid=None, ) if self.feed_id: feed_unionid = FeedUnionId(self.user_id, self.feed_id) ret.update(feed_id=feed_unionid) if detail: ret.update(message=self.message) return ret
def id(self): return FeedUnionId(self._user_feed.user_id, self._feed.id)
def feed_id(self): story = self._user_story or self._story return FeedUnionId(self._user_id, story.feed_id)
def feed_id(self): return FeedUnionId(self._user_id, self._story.feed_id)