Django使用一个字段反序列化,但使用另一个字段序列化
我有两个模型。Bar通过外键与Foo相关。在我的Bar序列化程序中,我有FooSerializer,因此它可以从其模型中序列化:Django使用一个字段反序列化,但使用另一个字段序列化,django,django-rest-framework,django-serializer,Django,Django Rest Framework,Django Serializer,我有两个模型。Bar通过外键与Foo相关。在我的Bar序列化程序中,我有FooSerializer,因此它可以从其模型中序列化: class BarSerializer(serializers.ModelSerializer): foo = FooSerializer(source='*') ... class Meta: model = Bar 然后,我的Foo序列化程序如下所示: class FooSerializer(serializers.Mod
class BarSerializer(serializers.ModelSerializer):
foo = FooSerializer(source='*')
...
class Meta:
model = Bar
然后,我的Foo序列化程序如下所示:
class FooSerializer(serializers.ModelSerializer):
name = serializers.StringRelatedField()
link = serializers.SerializerMethodField()
class Meta:
model = Foo
fields = ('name', 'link')
def to_internal_value(self, data):
# Save depending on name
foo = Foo.objects.get(name=data)
return {'foo': foo}
def get_link(self, object):
print('req', object.id)
if object.id and request:
return request.build_absolute_uri(
'/app/foo/{}'.format(object.id))
return None
我希望能够使用Foo的name
字段在酒吧中发布,例如:
{
"bar_name": "Nikko",
"foo": "The Foo",
}
但我想要的回答是:
{
"bar_name": "Nikko",
"foo": {
"name": "The Foo",
"link": "https://localhost:8000/apps/foo/1",
}
}
如果你想有一个自定义的响应,你必须重写
到_representation(self,instance)
更新
如果您想添加额外的上下文
,并从请求
获取信息,您可以这样添加它
获取请求数据时,可以在
to_representation()中使用self.context
。您需要将一个字段设置为只读,另一个字段设置为只读:
class BarSerializer(serializers.ModelSerializer):
foo = FooSerializer(source='*', read_only=True)
foo_write = serializers.SlugRelatedField(slug_field='name', queryset=Foo.objects.all(), write_only=True)
...
class Meta:
model = Bar
我使用SlugRelatedField,它将允许您使用name属性来搜索Foo实例。它假定Name字段是唯一的,否则您将无法检索正确的实例
如果SlugRelatedField
没有重新识别它所指的字段,您可能需要将source=“Foo”
添加到SlugRelatedField
。如何将request
传递到\u表示?我帖子中的名称会正确更改?例如,{“bar_name”:“Nikko”,“foo_write”:“The foo”}
在POST请求中,是的。不能为两个不同的字段指定相同的名称。
class BarSerializer(serializers.ModelSerializer):
foo = FooSerializer(source='*', read_only=True)
foo_write = serializers.SlugRelatedField(slug_field='name', queryset=Foo.objects.all(), write_only=True)
...
class Meta:
model = Bar