django - 如何编写自定义序列化器?

标签 django serialization django-rest-framework

我想在使用 DRF 发回 JSON 响应之前执行一些数据操作。

情况

我的模型是:

class ThirdParty(models.Model):
    label = models.CharField(verbose_name=_("Third party label"), null=False, blank=False, default=DEFAUT_LABEL, max_length=255)

class CashFlow(TimeStampedModel):
    date = models.DateField(verbose_name=_("Due date"), null=True, blank=True)
    forecasted_value = models.DecimalField(verbose_name=_("Forecasted value"), null=True, blank=True, max_digits=11, decimal_places=2)
    third_party = models.ForeignKey(ThirdParty, null=False, blank=False, related_name='cashflows')

目前我有两个序列化器:

class CashFlowSerializer(serializers.ModelSerializer):
    third_party = serializers.PrimaryKeyRelatedField(many=False, read_only=True, allow_null=True)
    class Meta:
        model = CashFlow
        fields = ('id', 'date', 'forecasted_value', 'edited_value', 'third_party')

class ThirdPartyReadSerializer(serializers.ModelSerializer):
    cashflows = CashFlowSerializer(many=True, read_only=True)
    class Meta:
        model = ThirdParty
        fields = ('id', 'label', 'category', 'cashflows',)

我的 ThirdParty View 正确返回一个漂亮的 JSON,如下所示:

{
        "id": 15,
        "label": "Adeo",
        "category": 7,
        "cashflows": [
            {
                "id": 1,
                "date": "2016-11-01",
                "forecasted_value": "2000.00",
                "edited_value": null,
                "third_party": 15
            },
            {
                "id": 2,
                "date": "2017-01-17",
                "forecasted_value": "3000.00",
                "edited_value": null,
                "third_party": 15
            },
            {
                "id": 3,
                "date": "2017-01-31",
                "forecasted_value": "1000.00",
                "edited_value": null,
                "third_party": 15
            }
        ]
    }

问题

我想按月对现金流进行分组并添加它们的值。 问题是:最好的方法是什么?

预期结果是:

{
        "id": 15,
        "label": "Adeo",
        "category": 7,
        "cashflows": [
            {
                "date": "2016-11-01",
                "forecasted_value": "2000.00",
                "edited_value": null,
                "third_party": 15
            },
            {
                "date": "2017-01-01",
                "forecasted_value": "4000.00",
                "third_party": 15
            }
        ]
    }

这将是一个只读序列化器。

最佳答案

使用序列化器的to_representation :

def to_representation(self, obj):
    data = super().to_representation(obj)
    # manipulate data['cashflows'] to group by month
    return data

关于django - 如何编写自定义序列化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747927/

相关文章:

python - 我如何保持干燥?

java - 当每个对象都自动序列化时,Java 中 "serializable"接口(interface)的目的是什么?

c# - 继承基类的 XMLType

python - django-过滤器 : icontains type of lookup expression doesn't work properly

python - django 查询集中的意外行为

python - Django:管理员在列出 bool 字段时出现 KeyError

c++ - 在不同的运行中保持对象状态

jquery - 向 Django REST Framework 发送 jQuery 请求导致未找到 JSON 对象错误

python - 通过 for 循环将字典推送到列表

python-3.x - 慢序列化过程 Django rest 框架