如何在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
相关产品推荐
相关产品推荐

