代码
我有这些模特:
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}}
但这导致端点没有输出。我知道这不是文档中提供的用例,这可能是它工作的原因。
我很高兴看到有什么代码可以完成这项工作:)
答案 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
会更符合默认行为,但我认为不太明确)