django - 在序列化程序中计算后保存到模型
问题描述
序列化程序将计算数据的平均分数并返回到字段中查看weekly_score
class BrandChartsSerializer(serializers.ModelSerializer):
rankings = serializers.SerializerMethodField()
instagram = IGSerializer(allow_null=True)
facebook = FBSerializer(allow_null=True)
hashtags = BrandHashtagSerializer(allow_null=True, many=True)
# rename the json field
brand_uid = serializers.IntegerField(source='id')
brand_name = serializers.CharField(source='name')
origin = serializers.CharField(source="country")
weekly_score = serializers.SerializerMethodField()
class Meta:
model = Brand
fields = [
"rankings",
"brand_uid",
"brand_name",
"origin",
"instagram",
"facebook",
"hashtags",
"weekly_score",
]
def get_weekly_score(self,instance):
data = self.get_rankings(instance)
result = 0
counter = 0
while data:
rankings = data.pop()
for key,value in rankings.items():
isFloat = isinstance(value,float)
if isFloat:
result += value
counter += 1
if counter is not 0:
result = result/counter
return result
我将在视图中进行排序sorted()
并返回为list
.
它的工作,但我发现它的速度非常非常慢,所以我想加快它。
我想我可以尝试的一种方法是,save
计算模型的每周分数(它已经在模型设计中有字段),这样我就可以使用order_by
.models
所以问题是,我可以同时阅读和更新view
吗?
我可以save/update
采取行动BrandChartsSerializer
吗?或相同viewset
(例如在一个视图中调用两个序列化程序等)
解决方案
Serializer Save 方法用于添加计算数据:
def save(self, **kwargs):
kwargs["weekly_score_on_model"] = calculate_weekly_score(self.validated_data)
self.instance = super().save(**kwargs)
return self.instance
推荐阅读
- unity3d - Unity Shader - 访问属性
- assembly - MIPS 汇编语言编程
- python - 更新与正则表达式条件匹配的数据框值并保持剩余值不变
- multithreading - 多处理与多线程的误解?
- c# - .NET Core 单选按钮组未传递给控制器
- python - 在同一数组中查找相对于它们的温度值的最大半衰期值
- mysql - MySQL - 从多个表中选择 SUM
- javascript - Vue面包屑找不到元
- python - Pyspark: Is there a way to create a Summary table (or dataframe) by merging multiple rows into one?
- java - 如何使用此代码在 Java 中正确格式化 paystub?