【发布时间】:2019-01-31 23:59:17
【问题描述】:
对于我的项目,我开始使用 Laravel 作为 api,而不是切换到 Django / django rest 框架,我这样做是为了获得更快的速度,因为我需要查询大数据。
现在我遇到了以下情况: 我有一个“组”,它有“主题”并且有递归关系。
现在一个组可以有 2000 多个科目(包括后代科目),而父科目有 +/- 30 个科目。
这是我的代码:
序列化器
class RecursiveField(serializers.Serializer):
def to_representation(self, value):
serializer = self.parent.parent.__class__(value, context=self.context)
return serializer.data
class SubjectSerializer(serializers.ModelSerializer):
parent_of = RecursiveField(many=True, read_only=True)
class Meta:
model = Subject
fields = ("id", "name", "parent_of", "parent")
class GroupSerializer(serializers.ModelSerializer):
subjects = SubjectSerializer(many=True, read_only=True)
class Meta:
model = Group
fields = ("id", "name", "subjects")
def setup_eager_loading(cls, queryset):
return queryset.prefetch_related("subjects")
观看次数
class GroupViewSet(ModelViewSet):
class Paginator(BasePaginator):
model = Group
queryset = Group.objects.all()
serializer_class = serializers.GroupSerializer
pagination_class = Paginator
def get_queryset(self):
return self.get_serializer().setup_eager_loading(GroupViewSet.queryset)
我用 laravel api 测试了相同的请求,它的速度要快得多,仍然明显慢,但没问题(5-10 秒)。使用 django rest 框架太慢(1 分钟 +/-),而这只是一个包含 1 个组的页面,该组有 2500 个主题。
我确实知道 RecursiveField 类需要很长时间,因为当我删除时,查询会在不到 2 秒的时间内完成。所以我的问题是主要原因是什么,因为它创建了递归关系(我怀疑)?还是因为我没有预取?
当然,最好的方法是什么?
谢谢
【问题讨论】:
-
查看 django-mptt 的主题模型。很稳定django-mptt.readthedocs.io/en/latest
标签: django django-rest-framework