示例#1
0
 def list(self, request):
     if 'user_id' not in request.query_params:
         return Response('missing user_id', status=400)
     tweets = Tweet.objects.filter(
         user_id=request.query_params['user_id']).order_by('-created_at')
     serializer = TweetSerializer(tweets, many=True)
     return Response({'Tweets': serializer.data}, status=200)
示例#2
0
    def list(self, request, *args, **kwargs):
        """
        overloading list function, make user_id as a requirement to filter
        """

        user_id = request.query_params['user_id']
        tweets = Tweet.objects.filter(user_id=user_id).prefetch_related('user')

        cached_tweets = TweetService.get_cached_tweets(user_id)
        page = self.paginator.paginate_cached_list(cached_tweets, request)
        if page is None:
            """
                            if 'user_id' not in request.query_params:
                        return Response('missing user_id', status=400)
                    The above line will be interpreted as following SQL:'
                    select * from twitter_tweets where user_id=xxx order by created_at DESC
                    this SQL query will be using composite index of user_id and created_at
                    """
            queryset = Tweet.objects.filter(
                user_id=user_id).order_by('-created_at')
            page = self.paginate_queryset(queryset)
        serializer = TweetSerializer(
            page,
            context={'request': request},
            many=True,
        )
        # usually response in JSON format should be included in hash
        # instead of a list
        return self.get_paginated_response(serializer.data)
示例#3
0
def api_user_tweet_list_view(request, username, *args, **kwargs):
    user = User.objects.filter(username=username).first()
    if (user):
        user_tweets = user.user_tweets.all()
        serializer = TweetSerializer(user_tweets, many=True)
        return Response(serializer.data, status.HTTP_200_OK)
    return Response({"error_message": "not found"}, status.HTTP_404_NOT_FOUND)
示例#4
0
 def list(self, request, *args, **kwargs):
     """
     重载 list 方法,不列出所有 tweets,必须要求指定 user_id 作为筛选条件
     """
     user_id = request.query_params['user_id']
     cached_tweets = TweetService.get_cached_tweet(user_id)
     page = self.paginator.paginate_cached_list(cached_tweets, request)
     if page is None:
         # 这句查询会被翻译为
         # select * from twitter_tweets
         # where user_id = xxx
         # order by created_at desc
         # 这句 SQL 查询会用到 user 和 created_at 的联合索引
         # 单纯的 user 索引是不够的
         queryset = Tweet.objects.filter(
             user_id=user_id).order_by('-created_at')
         page = self.paginate_queryset(queryset)
     serializer = TweetSerializer(
         page,
         context={'request': request},
         many=True,
     )
     # 一般来说 json 格式的 response 默认都要用 hash 的格式
     # 而不能用 list 的格式(约定俗成)
     return self.get_paginated_response(serializer.data)
 def list(self, request):
     if 'user_id' not in request.query_params:
         return Response('missing user_id', status=400)
     user_id = request.query_params['user_id']  #django 会自动把string转换成int
     tweets = Tweet.objects.filter(user_id=user_id).order_by('-created_at')
     serializer = TweetSerializer(tweets, many=True)  #返回list of dict
     return Response({'tweets': serializer.data})
示例#6
0
 def list(self, request):
     user_id = request.query_params['user_id']
     tweets = Tweet.objects.filter(user_id=user_id).order_by('-created_at')
     tweets = self.paginate_queryset(tweets)
     serializer = TweetSerializer(
         tweets,
         context={'request': request},
         many=True,
     )
     return self.get_paginated_response(serializer.data)
示例#7
0
class NewsFeedSerializer(serializers.ModelSerializer):
    tweet = TweetSerializer()

    class Meta:
        model = NewsFeed
        fields = (
            'id',
            'created_at',
            'user',
            'tweet',
        )
示例#8
0
    def list(self, request, *args, **kwargs):
        """
        override list
        """

        tweets = Tweet.objects.filter(
            user_id=request.query_params['user_id']).order_by('-created_at')

        serializer = TweetSerializer(tweets, many=True)

        return Response({'tweets': serializer.data})
示例#9
0
    def list(self, request):
        # only list when user id specified
        if 'user_id' not in request.query_params:
            return Response('missing user_id', status=400)

        # querying the composite index of user_id and created_at
        tweets = Tweet.objects.filter(
            user_id=request.query_params['user_id']).order_by('-created_at')

        serializer = TweetSerializer(tweets, many=True)

        return Response({'tweets': serializer.data})
示例#10
0
 def create(self, request, *args, **kwargs):
     serializer = TweetCreateSerializer(data=request.data,
                                        context={'request': request})
     if not serializer.is_valid():
         return Response(
             {
                 'success': False,
                 'message': "Please check input",
                 'errors': serializer.errors,
             },
             status=400)
     tweet = serializer.save()
     return Response(TweetSerializer(tweet).data, status=201)
示例#11
0
    def list(self, request, *args, **kwargs):
        # 之前使用如下的方式检验user_id 的
        # 因为发现comments中也要检查tweet_id 所以我们使用decorator的方式将两个功能相似的步骤简化为一个
        # if 'user_id' not in request.query_params:
        #     return Response('missing user_id', status=400)

        # 此处的搜索需要建立联合索引 来加快搜索速度
        # 需要在tweets -- models -- Tweet中建立联合索引
        tweets = Tweet.objects.filter(
            user_id=request.query_params['user_id']).order_by('-created_at')
        serializer = TweetSerializer(tweets,
                                     many=True)  # many=True说明会返回一个list of dict
        return Response({'tweets': serializer.data})
示例#12
0
 def create(self, request):
     serializer = TweetCreateSerializer(data=request.data,
                                        context={'request': request})
     if not serializer.is_valid():
         return Response(
             {
                 'success': False,
                 'message': 'Please check input',
                 'errors': serializer.errors,
             },
             status=400)
     tweet = serializer.save()
     NewsFeedService.fanout_to_followers(tweet)
     return Response(TweetSerializer(tweet).data, status=201)
示例#13
0
 def create(self, request):
     serializer = TweetCreateSerializer(data=request.data,
                                        context={'request': request})
     if not serializer.is_valid():
         return Response(
             {
                 "success": False,
                 "massage": "Please check input.",
                 "errors": serializer.errors,
             },
             status=400)
     # save will call create method in TweetSerializerForCreate
     tweet = serializer.save()
     return Response(TweetSerializer(tweet).data, status=201)
示例#14
0
 def list(self, request, *args, **kwargs):
     # composite index: take user and created_at
     tweets = Tweet.objects.filter(
         user_id = request.query_params['user_id']
     ).order_by('-created_at')   #reverse order
     # get instance of the list of tweets
     tweets = self.paginate_queryset(tweets)
     serializer = TweetSerializer(
         tweets,
         context={'request': request},
         many=True,
     )
     # By default return dict
     return self.get_paginated_response(serializer.data)
示例#15
0
 def list(self, request, *args, **kwargs):
     user_id = request.query_params['user_id']
     cached_tweets = TweetService.get_cached_tweets(user_id)
     page = self.paginator.paginate_cached_list(cached_tweets, request)
     if page is None:
         queryset = Tweet.objects.filter(
             user_id=user_id).order_by('-created_at')
         page = self.paginate_queryset(queryset)
     serializer = TweetSerializer(
         page,
         context={'request': request},
         many=True,
     )
     return self.get_paginated_response(serializer.data)
示例#16
0
    def list(self, request, *args, **kwargs):
        user_id = request.query_params['user_id']
        tweets = Tweet.objects.filter(user_id=user_id).prefetch_related('user')

        cached_tweets = TweetService.get_cached_tweets(user_id)
        page = self.paginator.paginate_cached_list(cached_tweets, request)
        if page is None:
            # select * from twitter_tweets where user_id = xxx
            # order by created_at desc
            queryset = Tweet.objects.filter(user_id=user_id).order_by('-created_at')
            page = self.paginate_queryset(queryset)
        serializer = TweetSerializer(
            page,
            context={'request': request},
            many=True,
        )
        return self.get_paginated_response(serializer.data)
 def create(self, request):
     serializer = TweetSerializerForCreate(
         data=request.data,
         context={'request': request},
     )
     if not serializer.is_valid():
         return Response(
             {
                 "success": False,
                 "message": "Please check input.",
                 "errors": serializer.errors,
             },
             status=400)
     #save will trigger create method in TweetSerializerForCreate
     tweet = serializer.save()
     NewsFeedService.fanout_to_followers(tweet)
     return Response(TweetSerializer(tweet).data, status=201)
示例#18
0
 def list(self, request, *args, **kwargs):
     # 这句查询会被翻译为
     # select * from twitter_tweets
     # where user_id = xxx
     # order by created_at desc
     # 这句 SQL 查询会用到 user 和 created_at 的联合索引
     # 单纯的 user 索引是不够的
     tweets = Tweet.objects.filter(
         user_id=request.query_params['user_id']).order_by('-created_at')
     serializer = TweetSerializer(
         tweets,
         context={'request': request},
         many=True,
     )
     # 一般来说 json 格式的 response 默认都要用 hash 的格式
     # 而不能用 list 的格式(约定俗成)
     return Response({'tweets': serializer.data})
示例#19
0
 def list(self, request, *args, **kwargs):
     """
         overload list method, we don't want to list all the tweets that all the users posts
         we use user_id as a filtering condition
     """
     user_id = request.query_params['user_id']
     cached_tweets = TweetService.get_cached_tweets(user_id=user_id)
     page = self.paginator.paginate_cached_list(cached_tweets, request)
     if page is None:
         queryset = Tweet.objects.filter(
             user_id=user_id).order_by('-created_at')
         page = self.paginate_queryset(queryset)
     serializer = TweetSerializer(
         page,
         context={'request': request},
         many=True,
     )
     return self.get_paginated_response(serializer.data)
示例#20
0
    def create(self, request, *args, **kwargs):
        serializer = TweetSerializerForCreate(
            data=request.data,
            context={'request': request},
        )

        if not serializer.is_valid():
            return Response(
                {
                    'success': False,
                    'message': "please check input",
                    'errors': serializer.errors,
                },
                status=400)
        tweet = serializer.save()
        NewsFeedService.fanout_to_followers(tweet)
        serializer = TweetSerializer(tweet, context={'request': request})
        return Response(serializer.data, status=201)
示例#21
0
class ReTweetSerializer(serializers.ModelSerializer):
    tweet_detail = TweetSerializer(source='tweet', read_only=True)

    class Meta:
        model = ReTweet
        fields = [
            'id',
            'text',
            'tweet',
            'tweet_detail',
        ]

    def create(self, validated_data):
        user = self.context['request'].user
        validated_data['created_by'] = user
        re_tweet = super().create(validated_data)
        action.send(user, verb='created re-tweet', action_object=re_tweet)
        return re_tweet
示例#22
0
 def create(self, request):
     """
     重载 create 方法,因为需要默认用当前登录用户作为 tweet.user
     """
     serializer = TweetSerializerForCreate(
         data=request.data,
         context={'request': request},
     )
     if not serializer.is_valid():
         return Response({
             'success': False,
             'message': "Please check input",
             'errors': serializer.errors,
         }, status=400)
     # save() will call create method in TweetCreateSerializer
     tweet = serializer.save()
     NewsFeedService.fanout_to_followers(tweet)
     serializer = TweetSerializer(tweet, context={'request': request})
     return Response(serializer.data, status=201)
示例#23
0
    def list(self, request, *args, **kwargs):
        """
        重载 list 方法,不列出所有 tweets,必须要求指定 user_id 作为筛选条件
        """
        if 'user_id' not in request.query_params:
            return Response('missing user_id', status=400)

        # 这句查询会被翻译为
        # select * from twitter_tweets
        # where user_id = xxx
        # order by created_at desc
        # 这句 SQL 查询会用到 user 和 created_at 的联合索引
        # 单纯的 user 索引是不够的
        tweets = Tweet.objects.filter(
            user_id=request.query_params['user_id']).order_by('-created_at')
        serializer = TweetSerializer(tweets, many=True)
        # 一般来说 json 格式的 response 默认都要用 hash 的格式
        # 而不能用 list 的格式(约定俗成)
        return Response({'tweets': serializer.data})
示例#24
0
    def create(self, request):
        serialzier = TweetSerializerForCreate(
            data=request.data,
            context={'request': request},
        )

        if not serialzier.is_valid():
            return Response(
                {
                    "success": False,
                    "message": "Please check input.",
                    "errors": serialzier.errors,
                },
                status=HTTP_400_BAD_REQUEST)

        tweet = serialzier.save()
        #fan out to followers
        NewsFeedService.fan_out_to_followers(tweet)
        return Response(TweetSerializer(tweet).data, status=HTTP_201_CREATED)
示例#25
0
 def list(self, request):
     # select out all tweets of a specific user
     cached_tweets = TweetService.load_tweets_through_cache(
         user_id=request.query_params['user_id']
     )
     page = self.paginator.paginate_cached_list(cached_tweets, request)
     # cache not enough
     if not page:
         tweets = Tweet.objects.filter(
             user_id=request.query_params['user_id']
         )
         page = self.paginate_queryset(tweets)
     serializer = TweetSerializer(
         page,
         context={'request': request},
         many=True,
     )
     # wrap the list of tweet contents in endless pagination
     return self.get_paginated_response(serializer.data)
示例#26
0
 def list(self, request, *args, **kwargs):
     user_id = request.query_params['user_id']
     cached_tweets = TweetService.get_cached_tweets(user_id)
     page = self.paginator.paginate_cached_list(cached_tweets, request)
     if page is None:
         # 这句查询会被翻译为
         # select * from twitter_tweets
         # where user_id = xxx
         # order by created_at desc
         # 这句 SQL 查询会用到 user 和 created_at 的联合索引
         # 单纯的 user 索引是不够的
         queryset = Tweet.objects.filter(
             user_id=user_id).order_by('-created_at')
         page = self.paginate_queryset(queryset)
     # many = true means it will return a list of dict
     serializer = TweetSerializer(page,
                                  context={'request': request},
                                  many=True)
     return self.get_paginated_response(serializer.data)
示例#27
0
 def create(self, request, *args, **kwargs):
     """
     重载 create 方法,因为需要默认用当前登录用户作为 tweet.user
     """
     serializer = TweetCreateSerializer(
         data=request.data,
         context={'request': request},
     )
     # use default validator, like min max length
     if not serializer.is_valid():
         return Response(
             {
                 'success': False,
                 'message': "Please check input",
                 'errors': serializer.errors,
             },
             status=400)
     tweet = serializer.save()
     NewsFeedService.fanout_to_followers(tweet)
     return Response(TweetSerializer(tweet).data, status=201)
示例#28
0
 def list(self, request):
     """
     重载 list 方法,不列出所有 tweets,必须要求指定 user_id 作为筛选条件
     """
     user_id = request.query_params['user_id']
     # get tweets from redis cache instead of DB
     cached_tweets = TweetService.get_cached_tweets(user_id=user_id)
     page = self.paginator.paginate_cached_list(cached_tweets, request)
     if page is None:
         queryset = Tweet.objects.filter(user_id=user_id).order_by('-created_at')
         page = self.paginate_queryset(queryset)
     serializer = TweetSerializer(
         page,
         context={'request': request},
         many=True,
     )
     # 一般来说 json 格式的 response 默认都要用 hash 的格式
     # 而不能用 list 的格式(约定俗成)
     # return Response({'tweets': serializer.data})
     return self.get_paginated_response(serializer.data)
示例#29
0
 def create(self, request):
     serializer = TweetSerializerForCreate(
         data=request.data,
         context={'request': request},
     )
     if not serializer.is_valid():
         return Response({
             "success": False,
             "message": "Please check input",
             "errors": serializer.errors,
         }, status=400)
     # otherwise we have a tweet instance here
     # save() will call create method in TweetSerializerForCreate
     tweet = serializer.save()
     NewsFeedService.fanout_to_followers(tweet)
     # Here I use TweetSerializer to show whats in the tweet
     # reminder: It is different from TweetSerializerForCreate
     return Response(
         TweetSerializer(tweet, context={'request': request}).data,
         status=201,
     )
示例#30
0
def user_detail_view(request, username):
    user = get_object_or_404(User, username=username)
    tweets = Tweet.objects.filter(user=user.id).order_by('-date_created')

    user_serializer = UserSerializer(user, context={'request': request})
    profile_serializer = ProfileSerializer(user.profile)
    tweets_serializer = TweetSerializer(tweets, many=True)

    if request.user.username == username:
        user_serializer = CurrentUserSerializer(user)

    response_data = {
        'user_data': user_serializer.data,
        'profile_data': profile_serializer.data,
        'tweets_data': tweets_serializer.data
    }

    for data, tweet in zip(tweets_serializer.data, tweets):
        data['isLiked'] = request.user in tweet.likes.all()

    return Response(response_data, status=status.HTTP_200_OK)