如何从django中具有@property装饰器的模型类序列化函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从django中具有@property装饰器的模型类序列化函数相关的知识,希望对你有一定的参考价值。

我正在使用django_rest框架,我想知道如何序列化具有@property装饰器的函数。在这种情况下,从下面的代码我有total_salary

class SalaryDetail(models.Model):
    employee = models.ForeignKey(Employee)
    year = models.IntegerField()
    month = models.CharField(max_length=2,
                                choices=MONTH_CHOICES)

    basic = models.PositiveSmallIntegerField()
    da = models.PositiveSmallIntegerField()
    hra = models.PositiveSmallIntegerField()
    allowance = models.PositiveSmallIntegerField(default=0)

    loss_of_pay = models.PositiveSmallIntegerField(default=0)

    repayment_of_loan = models.PositiveSmallIntegerField(default=0)

    @property
    def total_salary(self):
        return self.basic + self.da + self.hra + self.allowance

我知道在serializers.py中,我将从做这样的事情开始:

class SalaryDetailSerializer(serializers.ModelSerializer):
     class Meta:
          model: SalaryDetail
答案

您可以使用read_only设置为true的IntegerField()

class SalaryDetailSerializer(serializers.ModelSerializer):
    total_salary = serializers.IntegerField(read_only=True)

    class Meta:
        model = SalaryDetail
        fields = ('total_salary',)
另一答案

解决方案是,定义一个SerializerMethodField()如下,

class SalaryDetailSerializer(serializers.ModelSerializer):
    total_salary = serializers.SerializerMethodField()

    def get_total_salary(self, model):
        return model.total_salary()

    class Meta:
        model = SalaryDetail
        fields = ('total_salary',)

以上是关于如何从django中具有@property装饰器的模型类序列化函数的主要内容,如果未能解决你的问题,请参考以下文章

关于路径和自定义装饰器的 Python3 Django 问题

Python,如何添加另一个装饰器来过滤现有多装饰器的输出与python中的属性?

如何在具有模拟装饰器的测试中使用 pytest capsys?

Django - 将参数传递给 CBV 装饰器的正确方法?

Python的黑魔法@property装饰器的使用技巧

修复处理 @property setter 装饰器的 pyflakes