Django中的嵌套序列化器休息框架

时间:2016-10-05 17:42:16

标签: django serialization django-rest-framework

代码

我有这些模特:

class ActivitySerializer(serializers.ModelSerializer):
    class Meta:
        model = Activity

class RouteOrderingSerializer(serializers.ModelSerializer):
    class Meta:
        model = RouteOrdering
        fields = ('id','day','order','route_id','activity_id','tracks')

这些序列化器:

activity = ActivitySerializer( read_only=True)

问题

我希望RouteOrderingSerializer也返回具有相同activity_id的活动。为此我想我应该使用嵌套的序列化器。

我尝试了什么

我尝试过添加嵌套的序列化程序,如下所示:

{{1}}

但这导致端点没有输出。我知道这不是文档中提供的用例,这可能是它工作的原因。

我很高兴看到有什么代码可以完成这项工作:)

2 个答案:

答案 0 :(得分:1)

试试这个:

class ActivitySerializer(serializers.ModelSerializer):
    class Meta:
        model = Activity

class RouteOrderingSerializer(serializers.ModelSerializer):
    activity_id = ActivitySerializer()
    class Meta:
        model = RouteOrdering
        fields = ('id','day','order','route_id','activity_id')

答案 1 :(得分:1)

我不确定您在尝试以下代码时出现错误的原因。我认为这是一个与_id结尾相关的错误,但是当我运行它时一切正常。

class ActivitySerializer(serializers.ModelSerializer):
    class Meta:
        model = Activity

class RouteOrderingSerializer(serializers.ModelSerializer):
    activity_id = ActivitySerializer( read_only=True)
    class Meta:
        model = RouteOrdering
        fields = ('id','day','order','route_id','activity_id','tracks')

虽然可以,但我不建议在_id中使用以Django中的关系结尾的名称。问题是Django在内部存储了<relation_name>_id下的所有外键。这允许各种好的东西,例如将<object>.<relation_name>_id设置为整数id并将对象vs设置<object>.<relation_name>保存到整个相关对象(可能需要首先进行db查找)。我发现此行为不直观的一个地方是序列化程序,其中默认情况下将关系表示为"<relation_name>": <id>而不是"<relation_name>_id": <id>,但您可以显式声明<relation_name>_id字段并删除或单独嵌套<relation_name>字段。

如果您将关系重命名为不具有尾随_id,则以下内容将起作用:

class ActivitySerializer(serializers.ModelSerializer):
    class Meta:
        model = Activity

class RouteOrderingSerializer(serializers.ModelSerializer):
    activity = ActivitySerializer( read_only=True)
    class Meta:
        model = RouteOrdering
        fields = ('id','day','order','route_id','activity','tracks')

(请注意,声明route而不是route_id会更符合默认行为,但我认为不太明确)