Я использую базу отдыха 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})
Я действительно не понимаю, как добавить в него данные.
Я попытался переопределить список(), но ничего не произошло. Я обновил сообщение для вторых вопросов. – Windsooon
Спасибо, я просто пропустил «если страница не является ничем»: эта строка – Windsooon