SerializerMethodField не показывает все поля сериализатора, когда не существует отношения FK

Желаемый результат У меня есть вложенный ответ API, как показано ниже:

{
    "subject": {
        "name": "math",
        "teacher": <uuid>,
        "teacher_name": "John"
    },
    "grade": 1,
}

teacher_name - это пользовательское поле, которое использует teacher.

Он работает, когда установлены subject и grade. Но когда FK subject установлен null, я получаю такой ответ

Нежелательный результат

{
    "subject": {
        "name": "",
        "teacher": null,
    },
    "grade": 1,
}

Вопрос:

Я бы хотел, чтобы teacher_name также появлялся. Я пробовал настроить его как serializers.CharField

teacher_name= serializers.CharField(
    source="teacher.name",
    read_only=True,
    allow_blank=True,
    default=None,
)

и serializers.SerializerMethodField

teacher_name= serializers.SerializerMethodField()
def get_subject_teacher(self, obj):
    return obj.teacher.name

Но безуспешно.

Вот мой сериализатор для вложенного API

class StudentSerializer(serializers.ModelSerializer):
    subject = serializers.SerializerMethodField()
    def get_subject(self, obj):
        filtered_obj = getattr(obj, "subject", None)
        return SubjectSerializer(filtered_obj).data

    class Meta:
        model = Student
        fields = (
            "subject",
            "grade",
        )
class SubjectSerializer(serializers.ModelSerializer):
    teacher_name= serializers.CharField(
        source="teacher.name",
        read_only=True,
        allow_blank=True,
        default=None,
    )
    class Meta:
        model = Subject
        fields = (
            "name",
            "teacher",
            "teacher_name",
        )

Попробуйте это:

class SubjectSerializer(serializers.ModelSerializer):
    teacher_name= serializers.CharField(
        source="teacher.name",
        read_only=True,
        allow_blank=True,
        default="",
    )
    class Meta:
        model = Subject
        fields = (
            "name",
            "teacher",
            "teacher_name",
        )
Вернуться на верх