在使用Django REST framework Serializer的时候,并不一定单一的SerializerField就可以满足要求,比如遇到Model 中含有外键,如果Writable nested representations,则参考官方的例子重写create或者update方法就行,但如果要是想在deserializering的时候使用外键键值——object_id, serializering的时候表达出一些必要的信息,那么就需要对Serializer的字段进行一些特定的设置了。

根据Django 中对 ForeignKey的解释以及如何对ForeignKey查询对介绍

Database Representation

Behind the scenes, Django appends “_id” to the field name to create its database column name. In the above example, the database table for the Car model will have a manufacturer_id column.

The field specified in a lookup has to be the name of a model field. There’s one exception though, in case of a ForeignKey you can specify the field name suffixed with _id. In this case, the value parameter is expected to contain the raw value of the foreign model’s primary key.

1
Entry.objects.filter(blog_id=4)

所以在使用ModelSerializer的时候,很简单就可以实现,假如我们Bar model中有一个外键字段foo,那么BarSerializer可以有如下的定义:

1
2
3
class BarSerializer(serializers.ModelSerializer):
foo_id = serializers.IntegerField(write_only=True)
foo = FooSerializer(read_only=True)

在POST请求中,传入的字段名称为foo_id即可。而GET的时候,会使用FooSerializer对foo进行序列化,得到完整对外键内容。

参考

  1. https://stackoverflow.com/questions/36189303/django-rest-framework-receive-primary-key-value-in-post-and-return-model-object/53827209#53827209