@HolmesInc

Как в сериалайзере единожды вызвать метод, который получит данные для остальных полей?

На словах это выглядит так: Я получаю всю информацию о студентах из модели Students, передаю ее в сериалайзер и затем, на основе id студента мне нужно узнать, есть ли у него долги, содержащиеся в модели Debtors в поле debt (примерно как это выглядит в коде я описал ниже).
# model.py
class Students(models.Model):
   first_name = models.CharField(...)
   last_name = models.CharField(...)
   budget = models.BooleanField(...)

class Debtors(models.Model):
   debt = models.CharField(...)
   student_id = models.ForeignKey(...)

# viewset.py
class StudentsSet(viewsets.ModelViewSet):
   queryset = Students.objects.all()
   serializer_class = StudentsSerializer

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

# serializer.py
class StudentsSerializer(serializers.ModelSerializer):
   info = serializers.SerializerMethodField('get_info')
   class Meta:
      model = Students
      fields = ('id', 'info')

   def get_info(self, instance):
      return debt_info = Debtors.objects.filter(student_id=instance.id)

Суть в том, что по каждому отдельному id студента будет идти отдельный запрос к модели Debtors, а это не производительно. Я пытаюсь найти способ, как единожды вызвать метод, который получит данные из Debtors сразу по всем имеющимся id, а затем уже распределить эту информацию для каждого студента. Если писать запрос на SQL, то я хочу преобразовать это:
Select debt
From Debtors
Where student_id = какой-то id

В Это:
Select debt
From Debtors
Where student_id In (какой-то id, какой-то id, какой-то id)

Буду очень благодарен за варианты^^
  • Вопрос задан
  • 263 просмотра
Решения вопроса 1
@HolmesInc Автор вопроса
Проблема решена с помощью использования конструктора в сериалайзере:
def __init__(self, *args, **kwargs):
# getting and prepare data
# ...
super(StudentsSerializer, self).__init__(*args, **kwargs)

Может кому то будет полезно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@deliro
student_id = models.ForeignKey(...)

Ошибка. Ты присваиваешь объект, а не ID

queryset =  Students.objects.filter(budget=True)
return queryset

Лишняя строка

info = serializers.SerializerMethodField('get_info')
class Meta:

Не по PEPу

return debt_info = Debtors.objects.filter(student_id=instance.id)

Ошибка.

Debtors.objects.filter(student_id=instance.id)
Ошибка + можно использовать обратную связь

как единожды вызвать метод, который получит данные из Debtors сразу по всем имеющимся id

Debtors.objects.filter(student__in=твой_список_студентов)

а это не производительно

Преждевременная оптимизация?
Ответ написан
Ваш ответ на вопрос

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

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