需求
导航栏中,我们有父导航和嵌套的子导航,我们在序列化器中使用了序列化器嵌套来获取子导航,所以出现了子导航显示数据没有经过过滤全部输出的bug问题。解决方案有2种
1.重写Serializer序列化器基础类的to_representation方法,通过instance模型对象进行过滤。
2.采用自定义模型字段代替序列化器嵌套的使用
自定义序列化器嵌套的使用
在模型类中定义你要返回的类型
class Nav(BaseModel):
....
class Meta:
...
def __str__(self):
return self.name
@property
def son_list(self):
"""子导航"""
ret = self.son.filter(is_show=True, is_deleted=False).order_by('orders', 'id') # 得到每个对象
data = []
for nav in ret: # 循环quertset集合
data.append({
'name': nav.name,
'icon': nav.icon,
'link': nav.link,
'is_http': nav.is_http,
})
return data
序列化器中直接使用这个函数名即可
class NavModelSerializer(serializer.ModelSerializer):
"""导航序列化器"""
class Meta:
model = Nav
fields = ['name', 'icon', 'link', 'is_http', 'son_list']