有没有一种方法可以在Django中按需/onclick获取和序列化一部分数据来提高性能?

b1uwtaje  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(204)

我想获取一部分数据,并在用户从django请求并序列化时按需/onclick显示。
目前,我将所有数据提取到客户端,这可能会导致应用程序扩展时的性能问题。我如何使用下面的get代码片段来实现这一点。如果有人能帮我解决我想解决的问题,那就太好了。先谢谢你了。

def get(self, request, hashid=None, lang=None):
        try:
            if hashid:
                pk_id = settings.LKC_HASH.decode(hashid)[0]
                disease = Disease.objects.get(pk=pk_id)
                serializer = CategoriesSerializer(disease)
            else:
                diseases = Disease.objects.values('id', 'translations__subcategory', 'translations__name').all()
                serializer = CategoriesSerializer(diseases, many=True)

            return Response(serializer.data, status=status.HTTP_200_OK)

        except Disease.DoesNotExist:
            return Response({'error': 'Disease Does Not Exist!'}, status=status.HTTP_404_NOT_FOUND)

        except Exception as e:
            capture_exception(e)
            return Response({'error': 'There was an error while fetching the diseases!'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
anauzrmj

anauzrmj1#

是的,有办法。您可以通过defer()排除大字段,或者使用only()指定要加载的字段。
但这只对查询集有效!与.filter()相反,.get()方法不返回查询集,而是返回对象本身。因此,您可能需要调整CategoriesSerializer来处理查询集。

disease = Disease.objects.filter(pk=pk_id).only("wanted_field1", "wanted_field2")

你也可以使用.values()方法。

disease = Disease.objects.filter(pk=pk_id).values("wanted_field1", "wanted_field2")

这些方法将字段的规范直接传递给SQL命令。
我认为一旦你获取了对象本身,你就不再处理查询集了,它总是加载所有的字段。这就是为什么你很可能想继续使用查询集。
我不是100%确定,因为我只读过它,从来没有用过它自己。谢谢你的建议

阅读:

阅读本节中的第二个“注解”。它说.defer().only()仅用于高级用途,并提供了另一种方法。或许你该去试试看-你说了算。
它创建了另一个模型,该模型在Meta类中定义了managed = False。在该模型中,您可以指定常用的字段。
希望这些资源与您的使用情况相匹配,并对您有很好的帮助。

相关问题