简体   繁体   English

Django rest框架访问相关自定义字段

[英]Django rest framework access related custom fields

I want to sum all the Bars progress value in the FooSerializer我想对FooSerializer所有Bars progressFooSerializer

The code order is FooSerializer.get_progress -> BarSerializer , I can't access BarSerializer.progess in FooSerializer .代码顺序是FooSerializer.get_progress -> BarSerializer ,我无法访问BarSerializer.progess中的FooSerializer

from django.db import models
from rest_framework import serializers
from rest_framework.viewsets import ModelViewSet


class Foo(models.Model):
    name = models.CharField(max_length=180)

class Bar(models.Model):
    foo = models.ForeignKey(Foo, related_name='bars', on_delete=models.CASCADE)


class BarSerializer(serializers.ModelSerializer):
    progress = serializers.SerializerMethodField()

    def get_progress(self, instance):
        return 100  # some computed value


class FooSerializer(serializers.ModelSerializer):
    bars = BarSerializer(many=True)
    progress = serializers.SerializerMethodField()

    def get_progress(self, instance):
        # how to access barSerializer's progress ?
        total = sum(x.progress for x in instance.bars)
        return total

Instead of definining progress in bar serializer you can set the same method as a property in Bar model .您可以设置与 Bar 模型中的属性相同的方法,而不是在 bar 序列化程序中定义进度。

class Bar(models.Model):
    foo = models.ForeignKey(Foo,related_name='bars',on_delete=models.CASCADE)

    @property
    def progress(self):
        return 100

you can specify the progress field in Barserializer's fields.您可以在 Barserializer 的字段中指定进度字段。

class BarSerializer(serializers.ModelSerializer):
     class Meta:
           model = Bar 
           fields = '__all__' #specify fields you need in list/tuple(progress will be included in fields).
        

While for Foo serializer you can don't need the progress serializer field而对于 Foo 序列化器,您可以不需要进度序列化器字段

class FooSerializer(serializers.ModelSerializer):
    bars = BarSerializer(many=True)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM