如何使用 Django Rest Framework 有效地序列化 django-mptt?
How to serialize the django-mptt efficiently with Django Rest Framework?
serializers.py
class RecursiveField(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class CategorySerializer(serializers.ModelSerializer):
children = RecursiveField(many=True)
class Meta:
model = Category
fields=('id', 'title', 'description', 'children',)
它returns响应数据如:
{
"id": 1,
"title": "Bike",
"description": "",
"children": []
},
{
"id": 2,
"title": "Car",
"description": "",
"children": [
{
"id": 3,
"title": "Honda",
"description": "",
"children": []
}
]
},
{
"id": 3,
"title": "Honda",
"description": "",
"children": []
}
如上所示,ID:3的分类重复了。如果一个类别是某个类别的子类别,那么我不希望它再次单独显示。
我想要这样的响应数据:
{
"id": 1,
"title": "Bike",
"description": "",
"children": []
},
{
"id": 2,
"title": "Car",
"description": "",
"children": [
{
"id": 3,
"title": "Honda",
"description": "",
"children": []
}
]
}
有人可以帮我解决吗?
你可以只 return 根,所以只有根 return 而不是 parents 的 children,我就是这样做的。
class CategoryManager(TreeManager):
def viewable(self):
queryset = self.get_queryset().filter(level=0)
return queryset
在 Category
个模型中。
objects = CategoryManager()
然后在views
中我这样使用它:
queryset = Category.objects.viewable()
serializers.py
class RecursiveField(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class CategorySerializer(serializers.ModelSerializer):
children = RecursiveField(many=True)
class Meta:
model = Category
fields=('id', 'title', 'description', 'children',)
它returns响应数据如:
{
"id": 1,
"title": "Bike",
"description": "",
"children": []
},
{
"id": 2,
"title": "Car",
"description": "",
"children": [
{
"id": 3,
"title": "Honda",
"description": "",
"children": []
}
]
},
{
"id": 3,
"title": "Honda",
"description": "",
"children": []
}
如上所示,ID:3的分类重复了。如果一个类别是某个类别的子类别,那么我不希望它再次单独显示。 我想要这样的响应数据:
{
"id": 1,
"title": "Bike",
"description": "",
"children": []
},
{
"id": 2,
"title": "Car",
"description": "",
"children": [
{
"id": 3,
"title": "Honda",
"description": "",
"children": []
}
]
}
有人可以帮我解决吗?
你可以只 return 根,所以只有根 return 而不是 parents 的 children,我就是这样做的。
class CategoryManager(TreeManager):
def viewable(self):
queryset = self.get_queryset().filter(level=0)
return queryset
在 Category
个模型中。
objects = CategoryManager()
然后在views
中我这样使用它:
queryset = Category.objects.viewable()