首页 > 解决方案 > 在序列化程序中计算后保存到模型

问题描述

序列化程序将计算数据的平均分数并返回到字段中查看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(例如在一个视图中调用两个序列化程序等)

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


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

推荐阅读