请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师您好,我仿照您的例子写了一个demo,但是报了如下的错,一般下面这个错误应该用什么思路去解决?

AssertionError at /api/sendrecord/ The `.create()` method does not support writable nested fields by default. Write an explicit `.create()` method for serializer `device_operation.serializers.CreatSendRecordSerializer`, or set `read_only=True` on nested serializer fields.


正在回答 回答被采纳积分+3

4回答

yikogd 2019-07-10 11:35:21

我也遇到这个问题,原因是因为:

如文章model,有一个外键分类, 那么创建文章的时候,同时创建分类,会报你说的这个错误,

创建文章前应该先创建好分类,然后就没有这个问题了

0 回复 有任何疑惑可以回复我~
  • 提问者 程序员臻叔 #1
    其实可以用drf-writable-nested这个库解决问题
    回复 有任何疑惑可以回复我~ 2019-07-10 12:44:48
提问者 程序员臻叔 2018-04-07 22:47:41

已经解决了哦,谢谢老师,之前的原因确实是serializer重载create()时有问题,然后我把models层的外键设置为null=False,blank=False就行了,现在能够跑通了。但现在我还是不太明白,业务逻辑一般是在serializer里面做还是views里面做的好,我看到有些人写的代码,在models层还去做业务逻辑判断,现在有点迷茫。。

不知道我这么理解是不是对的:
views :应该是用来写业务逻辑的,然后是接收前端传过来的数据并且调用serializer去序列化数据,然后把数据返回给前端。另外views不能直接操作models
serializers:主要是用来做前端传来的参数进行校验的,然后直接可以操作models
models:只是orm映射,一般不要在此做业务逻辑判断?


0 回复 有任何疑惑可以回复我~
  • bobby #1
    这里大体理解是没有问题的, 但是有个理解误区就是views里面是需要操作models的,而且是操作models主要地方,只是因为业务比较简单的情况下直接交给serializer去做就行了, 随着业务复杂的时候。操作models和放到views里面和serializer里面协同完成,你要知道views才是业务逻辑最主要的地方, serializer是用来做数据序列化和表单验证的和django的form功能一致,models一般用来做orm映射,一般不和业务相关只放和数据逻辑相关的,这样代码设计会合理不会导致后期维护灾难
    回复 有任何疑惑可以回复我~ 2018-04-08 16:18:06
  • 提问者 程序员臻叔 #2
    多谢bobby老师解答!明白了
    回复 有任何疑惑可以回复我~ 2018-04-09 12:18:47
bobby 2018-04-07 09:15:08

能否截图我看看你的model设计以及你的view的逻辑和你的serializer的代码

0 回复 有任何疑惑可以回复我~
提问者 程序员臻叔 2018-04-05 14:46:53

可能没描述清楚,主要情况就是:我的device表里有ssid和mac两个字段,我的sendrecord表里有device外键和send_status,我想做的是,在post请求sendrecord这个接口的时候,同时把device里面的数据也同步一下,但是就报了上面的错误。但是我在sendrecordViewSet里面,我已经重载了create()方法,可还是不行,另外,我看我serializer里的的所有字段,也没有一个是write_only的,这个怎么解决呢

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信