MethodField, содержащий сериализованный объект, не возвращает результаты MethodField надлежащего объекта

#django #serialization #django-rest-framework

#django #сериализация #django-rest-framework

Вопрос:

У меня есть два таких сериализатора.

 class CourseSerializer(serializers.ModelSerializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(required=True, max_length=30, allow_blank=False)
    chapters = serializers.SerializerMethodField()

    def get_chapters(self, obj):
        queryset = Chapter.objects.all().filter(course=obj.pk)
        serializer_class = ChapterSerializer(queryset, many=True)
        return serializer_class.data

class ChapterSerializer(serializers.ModelSerializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(required=True, max_length=30, allow_blank=False)
    course = serializers.StringRelatedField()
    cards_count = serializers.SerializerMethodField()
    cards_learned_count = serializers.SerializerMethodField()
    cards_still_to_go = serializers.SerializerMethodField()
    cards_not_learned = serializers.SerializerMethodField()

    def get_cards_learned_count(self, obj):
        user = None
        request = self.context.get("request")
        if request and hasattr(request, "user"):
            user = request.user

        queryset = Card.objects.all().filter(chapter=obj.pk)
        card_count = 0
        for q in queryset:
            card_detail = UserCardDetail.objects.all().filter(card=q, user=user, learned=True)
            card_detail.count()
            card_count  = card_detail.count()
        return card_count
  

Теперь, когда я получаю сериализатор курса вместо получения правильных значений в поле главы, я получаю нули, но когда я вызываю сериализатор главы, я получаю правильные значения.

Я заметил, что MethodField работает с obj — однако разве это не должно быть передано уже?

Есть ли что-то дополнительное, что я должен передать в поле главы?

Редактировать: выходные и ожидаемые выходные
данные

 {
    "name": "Example 1",
    "pk": 32,
    "locked": false,
    "chapters": [
      {
        "pk": 15,
        "name": "Transformatori",
        "course": "Tesit",
        "cards_count": 5,
        "cards_learned_count": 0,
        "cards_still_to_go": 0,
        "cards_not_learned": 0,
        "favorite_cards": 0
      }, 
    ],
  },
  

ожидаемый результат

 {
        "name": "Example 1",
        "pk": 32,
        "locked": false,
        "chapters": [
          {
            "pk": 15,
            "name": "Transformatori",
            "course": "Tesit",
            "cards_count": 5,
            "cards_learned_count": 3,
            "cards_still_to_go": 0,
            "cards_not_learned": 2,
            "favorite_cards": 1
          }, 
        ],
      },
  

Комментарии:

1. Я не уверен, что это проблема, но разве это не должно быть course_id=obj.pk или course=obj , нет course=obj.pk ?

2. @JonathanRichards Я изменил это, но все равно не повезло. Я добавил образец вывода.