ModelSerializer 使用知识点_serializers.SerializerMethodField()使用场景总结

半腔热情 提交于 2019-11-30 12:26:48
serializers.SerializerMethodField和钩子方法结合,可以实现对ModelSerializer类的一些字段进行二次加工,返回,如下:1、对以ModelSerializer的类为外键数据进行处理
model如下:
A、Project
class Project(models.Model):    """    项目表    """    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=50, verbose_name='项目名称')    version = models.CharField(max_length=50, verbose_name='版本')    description = models.CharField(max_length=1024, blank=True, null=True, verbose_name='描述')    status = models.BooleanField(default=True, verbose_name='状态')    LastUpdateTime = models.DateTimeField(auto_now=True, verbose_name='最近修改时间')    createTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, max_length=1024, verbose_name='创建人')    def __unicode__(self):        return self.name    def __str__(self):        return self.name    class Meta:        verbose_name = '项目'        verbose_name_plural = '项目'
B、ApiInfo (以project为外键)

class ApiInfo(models.Model):    """    接口信息    """    id = models.AutoField(primary_key=True)    project = models.ForeignKey(Project, related_name='api_project', on_delete=models.CASCADE, verbose_name='所属项目')    def __unicode__(self):        return self.name    def __str__(self):        return self.name    class Meta:        verbose_name = '接口'        verbose_name_plural = '接口管理'
 
2、project的ModelSerializer如下:
class ProjectSerializer(serializers.ModelSerializer):    """    项目信息序列化    """    apiCount = serializers.SerializerMethodField()    LastUpdateTime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)    createTime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)    user = serializers.CharField(source='user.first_name')    class Meta:        model = Project        fields = ('id', 'name', 'version', 'type', 'status', 'LastUpdateTime', 'createTime', 'apiCount',                  'dynamicCount', 'memberCount', 'description', 'user')    def get_apiCount(self, obj):        return obj.api_project.all().count()  通过 obj.以它为外键的类字段的related_name 取出以它为外键的对象,该对象可以进行进行一般的model类操作(如obj.api_project.all().count()、obj.api_project.get(XXX查询条件).XXX属性),从而处理以它为外键的数据
 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!