You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django REST Framework中使用模型@property装饰器并返回字段?

解决Django REST Framework中访问@property字段的问题

1. 修正模型中的@property定义

你的Price属性存在几处问题:命名不符合Python小写惯例、缺少返回值、直接用模型对象做乘法运算会触发错误。修改后的代码如下:

# models.py
class TempCalculate(models.Model):
    items = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    create_at = models.DateField(auto_now_add=True)
    create_by = models.ForeignKey(User, on_delete=models.CASCADE)

    @property
    def price(self):
        # 假设PriceMaster有一个`price`字段存储单价
        price_master = PriceMaster.objects.get(items=self.items)
        return price_master.price * self.quantity

补充:如果PriceMaster中对应items的记录可能不存在,建议用get_object_or_404捕获异常;频繁调用该属性会触发多次数据库查询,可在视图中用select_related优化:

queryset = TempCalculate.objects.all().select_related('items__pricemaster')

2. 在序列化器中显式声明该属性

DRF的ModelSerializer默认只包含模型的数据库字段,不会自动识别@property定义的属性,需要在序列化器中手动添加:

# serializers.py
from rest_framework import serializers
from base.models import TempCalculate

class TempCalSerializer(serializers.ModelSerializer):
    # 声明price为只读计算字段
    price = serializers.ReadOnlyField()

    class Meta:
        model = TempCalculate
        fields = "__all__"
        # 也可以指定具体字段:fields = ['id', 'items', 'quantity', 'create_at', 'create_by', 'price']

3. 视图代码无需修改

你的视图逻辑保持原样即可,现在请求API时就能获取到计算后的price字段。

内容的提问来源于stack exchange,提问作者shyam rathod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:15:17