关于DRF序列化器模型字段参数设置报错AssertionError: May not set both `read_only` and `write_only`

如下图,在定义序列化器的元类extra_kwargs属性中可以指定模型字段的额外参数,当我指定price字段的write_only=true时,序列化输出给前端的数据中都不会出现price这个字段。

 

但是当我指定nid字段的write_only=true时,就报错了:

说不能同时设置read_only 和 write_only为True。这是由于主键nid默认read_only=True,在post新增数据body中可以不用传nid的值,反序列化用不到。

那怎么让nid主键同时拥有read_only和write_only,在请求中不用传入nid且在响应中不显示nid呢?

可以通过错误信息重写父类__init__()方法,指定类Field的对象fields的write_only为True:

 这样无论在get或者post都不会显示nid了:

对于其他字段,如价格,如果想请求的时候不传入价格,则需要指定默认价格不然会报错django.db.utils.IntegrityError: (1048, "Column 'price' cannot be null"),再加上write_only=True使得响应时不显示价格,不用重写init:

 

以上的视图部分:

原文地址:https://www.cnblogs.com/wangyi0419/p/14442532.html