Как получить атрибут класса сериализатора в DRF?
У меня есть класс сериализатора CourseSerializer
. В курсе может быть несколько групп, уроков и т.д. Код для сериализатора:
class CourseSerializer(serializers.ModelSerializer):
lessons = MiniLessonSerializer(many=True, read_only=True)
lessons_count = serializers.SerializerMethodField(read_only=True)
students_count = serializers.SerializerMethodField(read_only=True)
groups_filled_percent = serializers.SerializerMethodField(read_only=True)
demand_course_percent = serializers.SerializerMethodField(read_only=True)
def get_lessons_count(self, obj) -> int:
return obj.lessons.count()
def get_students_count(self, obj) -> int:
amount = Subscription.objects.filter().count()
return amount
def get_groups_filled_percent(self, obj) -> int:
counts = [group.users.count() for group in obj.groups.all()]
return ((sum(counts) / len(counts)) / 30) * 100
def get_demand_course_percent(self, obj) -> int:
users = CustomUser.objects.all().count()
students = Subscription.objects.filter().count()
return (students / users) * 100
Как вы видите, у сериализатора есть вычисляемые атрибуты, такие как lessons_count
, students_count
и т.д..
Вопрос в том, как я могу получить один из этих атрибутов в методе сериализатора, например:
def get_demand_course_percent(self, obj) -> int:
users = CustomUser.objects.all().count()
return (self.students_count / users) * 100_
Если я делаю это явно, то выдается ошибка Attribute, что в классе сериализатора нет такого атрибута
А как насчет реализации метода в виде вызова?
def get_demand_course_percent(self, obj) -> int:
users = CustomUser.objects.all().count()
return (self.get_students_count(obj=None) / users) * 100_