【发布时间】:2019-08-16 10:23:07
【问题描述】:
初始打开:我正在使用 postgresql JSONFields。
我的User 模型中有以下attribute(字段):
class User(AbstractUser):
...
benefits = JSONField(default=dict())
...
我目前基本上使用 DRF 为前端的每个用户序列化收益:
benefits = UserBenefit.objects.filter(user=self)
serializer = UserBenefitSerializer(benefits, many=True)
由于底层返回的好处变化很小而且很慢,所以我考虑每次发生变化时都将JSON“缓存”在数据库中以提高UserBenefit.objects.filter(user=user)QuerySet的性能。相反,成为user.benefits 并有望减轻超过 10 万用户的数据库负载。
第一个问题:
我应该这样做吗?
第二问:
有没有一种有效的方法将对应的serializer.data<class 'rest_framework.utils.serializer_helpers.ReturnList'>写入JSON字段?
我目前正在使用:
data = serializers.serialize("json", UserBenefit.objects.filter(user=self))
【问题讨论】:
-
通过添加此字段,您基本上消除了查询、后端逻辑和 json 序列化。 Json 序列化几乎总是很快,因此如果您预计当前方法会出现问题,您需要检查您的 SQL 查询(注意索引、FK、反向 FK、M2M、二进制字段和大型文本字段)和后端逻辑。每个用户有多少
UserBenefit对象? -
所以我目前的问题是 DB 层可能随时受到 4/5 API 请求的影响,并且由于某种原因,
UserBenefitsViewSet 对其余部分的运行速度相当缓慢。最终,很多查询都会以这种方式存储…… -
如果不知道实际查询、它们的时间(最好使用
EXPLAIN ANALYZE)和实际的后端逻辑(是否有任何可计算的字段正在发出其他数据库查询?),很难说什么是正确的方法? -
好的,如果我们暂时跳过它,如果我知道如何处理第二个问题,我可以测试我的假设。我目前在 JSON 中看到很多乱码 \stuff\ API返回...我需要以某种方式将
benefits转换为json ... -
只要使用
UserBenefitSerializer(benefits, many=True).data
标签: django django-rest-framework django-2.2 django-jsonfield