class RepairQueueSerializer(serializers.ModelSerializer): # rq_base = serializers.CharField() tasks_not_finish = serializers.SerializerMethodField() tasks_wait_for = serializers.SerializerMethodField() tasks_finish = serializers.SerializerMethodField() class Meta: model = models.RepairQueue fields = ('rqid', 'rq_type', 'rq_desc', 'rq_level', 'rq_time', 'rq_user', 'rq_contact', 'rq_status', 'rq_report', 'rq_tasks_choice', 'rq_work_status', 'tasks_not_finish', 'tasks_wait_for', 'tasks_finish') def get_tasks_not_finish(self, obj): return models.RepairQueue.objects.filter(rq_tasks_choice='未完成').count() def get_tasks_wait_for(self, obj): return models.RepairQueue.objects.filter(rq_tasks_choice='待验收').count() def get_tasks_finish(self, obj): return models.RepairQueue.objects.filter(rq_tasks_choice='已完成').count() def create(self, validated_data): validated_data['rqid'] = DBHelper.get_id('uni_repairqueue', 'WYWX') return models.RepairQueue.objects.create(**validated_data)
添加一个 get_tasks_not_finish 方法,这个方法的命名规则就是在上面声明的属性前面加上个 “get_” 前缀,并接受一个 obj 参数,这个 obj 参数就是当前的 models.RepairQueue 对象实例。前端
1. serializer能够作逻辑上的操做,然而最好不要作查询(你能够用SerializerMethodField作一些数据转换例如0变为假1变为真什么的,然而最好不要作复杂的数据库查询),这种事情能够在view上作好(注意能够用select_related减小屡次查询),
由于这是每个model都要serializer一次。
2. 若是说跟前端对的修改和查询使用不一样的serializer,那么你就写两个,不但愿修改的字段加上readonly(或者放在readonly_fields里面)
对于外键字段实现显示被关联的字段而不是id数据库
例:外键优化
class CommentSerializer(serializers.ModelSerializer): name = serializers.SerializerMethodField('get_user_name') class Meta: model = Comment fields = ('name', 'create_time', 'text') def get_user_name(self, obj): return obj.author.nickname
如上图,obj是对应的模型,此处是Comment。author是Comment的ForeignKeyField,nickName是Author的一个字段。spa
例:多对多.net
def get_who_like_it(self, obj): return [author.nickname for author in obj.like.all()]
参考:https://blog.csdn.net/csdn_yi_e/article/details/86475587code