2

初始开放:我正在使用 postgresql JSONFields。

我的模型中有以下attribute(字段)User

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))

4

1 回答 1

1

对于你的第一个问题:

如果您不想使用缓存替代方案,这不是一个坏主意。

如果您因为某些更改或...而必须查询数据库,并且您无法缓存空洞请求,那么保存 JSON 对象的想法可能是一个不错的主意。这样,您只需检索数据并跳过序列化的大部分部分,并终止查询数据透视表以获取 m2m 数据的需要。但也请注意,这样,您将向行中添加一大堆额外数据,除非您大部分时间都需要它们,否则您将获得您并不真正需要的额外数据,您可以提供帮助它在查询集上使用values函数,但仍然需要更多编码。基本上,您将为您的第一个查询使用更多带宽,并使用更多存储空间来存储数据,而不是处理能力。benefits此外,如果您在某些时候需要它,分页将很难实现。

获取 m2m 关系数据通常非常快,具体取决于数据库上的数据量,但获得更好性能的最终方法是缓存请求并尽可能减少数据库命中。

正如您可能经常听到的那样,您应该根据您的要求和限制进行测试和基准测试,看看哪些选项最适合您。在不了解有关整个范围和当前解决方案的信息的情况下,很难提出优化方法。

对于你的第二个问题:

我想我真的不明白。如果您要存储一个 JSON 对象,它是User模型中的一个字段,那么您为什么需要data = serializers.serialize("json", UserBenefit.objects.filter(user=self))呢?

您不需要它,因为序列化程序可以只返回 JSON 字段数据。

于 2019-08-16T10:57:36.697 回答