当不存在 FK 关系时,SerializerMethodField 不显示序列化程序的所有字段

SerializerMethodField not showing all fields of serializer when no FK relationship exists

想要的结果:

我有一个嵌套的 API 响应,如下所示:

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

teacher_name 是使用 teacher.

的自定义字段

设置subjectgrade时有效。但是当 FK subjectnull 时,我得到这个响应:

不需要的结果

{
    "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",
        allow_blank=True,
        default=None,
    )
    class Meta:
        model = Subject
        fields = (
            "name",
            "teacher",
            "teacher_name",
        )