Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django使用一个字段反序列化,但使用另一个字段序列化_Django_Django Rest Framework_Django Serializer - Fatal编程技术网

Django使用一个字段反序列化,但使用另一个字段序列化

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

我有两个模型。Bar通过外键与Foo相关。在我的Bar序列化程序中,我有FooSerializer,因此它可以从其模型中序列化:

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