@HolmesInc

Можно ли(и если да то как) получить все данные, переданные в Serializer?

Скажем у нас viewset:
class StudentsSet(viewsets.ModelViewSet):
   queryset = Students.objects.all()
   serializer_class = StudentsSerializer

   def get_queryset(self):
      queryset =  Students.objects.filter(present=True)
      return queryset

И собственно сам сериалайзер с методом, через который я получаю некую информацию:
class StudentsSerializer(serializers.ModelSerializer):
   info = serializers.SerializerMethodField('get_info')
   class Meta:
      model = Students
      fields = ('id', 'info')

   def get_info(self, instance):
      return student_info = Students.objects.filter(id=instance.id)

Пример конечно кривоват, НО сут в чём -
по каждому студенту каждый раз будет вызываться метод get_info, что будет замедлять в дальнейшем загрузку страницы, на которую эти данные передаются. Поэтому я бы хотел информацию сразу по ВСЕМ id, скажем использовав IN:
Students.objects.filter(id__in=(1, 2, 3))
Но из instance можно получить только 1 id за раз, а как получить их ВСЕ?
  • Вопрос задан
  • 485 просмотров
Решения вопроса 1
@HolmesInc Автор вопроса
Проблема решена с помощью использования конструктора в сериалайзере:
def __init__(self, *args, **kwargs):
# getting and prepare data
# ...
super(StudentsSerializer, self).__init__(*args, **kwargs)

Может кому то будет полезно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Возможно, я не понимаю, что вы пытаетесь реализовать. Допустим, вы пытаетесь получить список всех студентов с минимальной информацией, а потом, на странице подробностей вывести дополнительную информацию.

Для этого используйте два сериалайзера. Первый для списка api/students/, второй для детальной страницы api/students/{pk}

#model.py
class Student(models.Model):
    first_name = models.CharField(...)
    last_name = models.CharField(...)

    # info может быть вычисляемым свойством
    @property
    def info(self):
        # какая-то логика
        return info


# serializers.py
class StudentListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ('id', 'first_name', 'last_name')


class StudentDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ('id', 'first_name', 'last_name', 'info')

# views.py
class StudentViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Student.objects.all()
    
    def get_serializer_class(self):
        if self.action == self.__class__.retrieve.__name__:
            return serializers.StudentDetailSerializer
        if self.action == self.__class__.list.__name__:
            return serializers.StudentListSerializer
        return serializers.StudentListSerializer
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы