2016-05-05 3 views
0

Я использую базу отдыха Django, вот мой serializers.py для социальных приложений:Заказать данные по полю без базы данных

class SocialPostSerializer(serializers.ModelSerializer): 

    likes = serializers.SerializerMethodField() # define field 

    class Meta: 
     model = SocialPost 

    def get_likes(self, obj): 
     post_id = obj.id 
     #I get post_like from django-redis 
     post_like = get_redis_connection("default") 
     likes = post_like.get("post"+":"+str(post_id)) 
     if likes == None: 
      return 0 
     else: 
      likes = likes.decode('utf-8') 
      return likes 

С выше коде, я получил то, что мне нужно от API.

С «любит» не существует в моей базе данных (Mysql здесь), я не могу с помощью order_by («любит») для сортировки данных с Джанго ОРМ

Я следую документ здесь ListCreateAPIView, которые приводят мне переопределить список(): (я должен был отменить создание() и get_queryset() перед)

from operator import itemgetter 

class PostList(generics.ListCreateAPIView): 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,) 
    queryset = Post.objects.all() 
    serializer_class = PostAllSerializer 


    def list(self, request, *args, **kwargs): 
     queryset = self.filter_queryset(self.get_queryset()) 

     page = self.paginate_queryset(queryset) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 

     serializer = self.get_serializer(queryset, many=True) 
     #problem here 
     serializer.data = sorted(serializer.data, key=itemgetter(serializer.data['likes'])) 
     return Response(serializer.data) 

    def create(self, request, *args, **kwargs): 
     act_id = request.data.get('act') 
     act = Act.objects.get(pk=act_id) 
     if act.act_type == 0: 
      if request.user != act.user: 
       return Response(status=403) 
     return super().create(request, args, kwargs) 

    def perform_create(self, serializer): 
     serializer.save(user=self.request.user) 

    def get_queryset(self): 
     queryset = Post.objects.all().order_by('-post_create_time') 
     act_id = self.request.query_params.get('act_id', None) 
     post_author = self.request.query_params.get('post_author', None) 
     if act_id is not None: 
      queryset = queryset.filter(act=act_id) 
     if post_author is not None: 
      queryset = queryset.filter(user__user_name=post_author) 
     return queryset 

Ничего не случилось, Что проводной даже когда я раскомментировать

return Response(serializer.data) 

до сих пор ничего случилось, какая часть не так?

Другой вопрос, когда я хочу добавить некоторые дополнительные данные, такие как «вопрос» когда я использую Джанго FBV:

def results(request, question_id): 
    question = get_object_or_404(Question, pk=question_id) 
    return render(request, 'polls/results.html', {'question': 'some data I wanna add'}) 

Можно добавить данные в serializer.data? Например, я хочу отображения user_id, из которого запрос пользователя этого API:

def list(self, request, *args, **kwargs): 
     queryset = self.filter_queryset(self.get_queryset()) 

     page = self.paginate_queryset(queryset) 
     if page is not None: 
      serializer = self.get_serializer(page, many=True) 
      return self.get_paginated_response(serializer.data) 
     user_id = request.user.id #how can I add the user_id into response data? 
     serializer = self.get_serializer(queryset, many=True) 
     return Response(serializer.data) 

я смотрю вокруг документы здесь Including extra context.

serializer = AccountSerializer(account, context={'request': request}) 

Я действительно не понимаю, как добавить в него данные.

ответ

0

«Так как„любит“не существует в моей базе данных (Mysql здесь), я не могу с помощью order_by („любит“) для сортировки данных с Джанго ОРМ»

Вы не сможете для сортировки результатов с помощью django ORM, так как поле типа не является частью вашей таблицы DB. Единственный способ сделать это - отсортировать данные serializer.data, которые вы получите в своем представлении. В вашем случае serializer.data будет списком словаря, вы можете использовать команду сортировки для списка и сортировать по полю, используя lambda.

Осторожно, так как вы будете делать сортировку, загружая данные в память, убедитесь, что вы не загружаете много данных. Проверьте наличие памяти.

«Другой вопрос, когда я хочу добавить некоторые дополнительные данные, такие как„вопрос“когда я использую Джанго FBV»

Я did'nt понимаю, что нужно здесь.

+0

Я попытался переопределить список(), но ничего не произошло. Я обновил сообщение для вторых вопросов. – Windsooon

+0

Спасибо, я просто пропустил «если страница не является ничем»: эта строка – Windsooon

Смежные вопросы