Python django中的序列化关系

Python django中的序列化关系,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有两个模型-->候选和等级。1名候选人具有多个等级。我想从RESTAPI返回一个候选人可以获得的多个等级的平均等级。我怎么能这样做 我的型号: class Candidate(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) class Grade(models.Model): value = models.Integ

我有两个模型-->候选和等级。1名候选人具有多个等级。我想从RESTAPI返回一个候选人可以获得的多个等级的平均等级。我怎么能这样做

我的型号:

class Candidate(models.Model):
   first_name = models.CharField(max_length=50)
   last_name = models.CharField(max_length=50)

class Grade(models.Model):
   value = models.IntegerField(blank=True, null=True)
   candidate = models.ForeignKey(Candidate, on_delete=models.CASCADE, related_name='grades') 
我的序列化程序.py

from rest_framework import serializers
from .models import Candidate, Grade


class CandidateSerializer(serializers.ModelSerializer):

   pk = serializers.SerializerMethodField('get_pk_from_candidate')
   full_name = serializers.SerializerMethodField('get_full_name_from_candidate')
   grades = serializers.SlugRelatedField(many=True, read_only=True, slug_field='value')
   
   class Meta: 
    
      model = Candidate
 
      fields = ['pk', 'full_name', 'avg_grade', 'grades']

  
   def get_pk_from_candidate(self, candidate):
      return candidate.id

   
   def get_full_name_from_candidate(self, candidate):
      data = (candidate.first_name, candidate.last_name)
      full_name = ' '.join(data)

      return full_name
我希望我的JSON格式如下所示:

{
      "pk": 3,
      "full_name": "rafał małek",
      "avg_grade": "",
      "grades": [
        12,
        4,
        13,
        5
      ]
    },
您可以将和ORM的与Avg一起使用

从django.db.models导入平均值
从rest_框架导入序列化程序
from.models导入候选人,等级
类候选序列化程序(serializers.ModelSerializer):
pk=serializers.SerializerMethodField('get_pk_from_candidate')
full\u name=serializers.SerializerMethodField('get\u full\u name\u from\u candidate')
avg_grade=序列化程序。SerializerMethodField('get_avg_grade'))
grades=serializers.SlugRelatedField(many=True,read\u only=True,slug\u field='value')
类元:
模型=候选人
字段=['pk'、'full_name'、'avg_grade'、'grades']
def从候选者(自我,候选者)处获取候选者:
返回候选者id
def从候选人(自我,候选人)处获取候选人全名:
数据=(候选者.名字,候选者.姓氏)
全名=''.join(数据)
返回全名
def get_平均等级(自我、候选人):
返回候选者.grades.aggregate(平均值('value'))['value\uu Avg']
您可以将和ORM的与Avg一起使用

从django.db.models导入平均值
从rest_框架导入序列化程序
from.models导入候选人,等级
类候选序列化程序(serializers.ModelSerializer):
pk=serializers.SerializerMethodField('get_pk_from_candidate')
full\u name=serializers.SerializerMethodField('get\u full\u name\u from\u candidate')
avg_grade=序列化程序。SerializerMethodField('get_avg_grade'))
grades=serializers.SlugRelatedField(many=True,read\u only=True,slug\u field='value')
类元:
模型=候选人
字段=['pk'、'full_name'、'avg_grade'、'grades']
def从候选者(自我,候选者)处获取候选者:
返回候选者id
def从候选人(自我,候选人)处获取候选人全名:
数据=(候选者.名字,候选者.姓氏)
全名=''.join(数据)
返回全名
def get_平均等级(自我、候选人):
返回候选者.grades.aggregate(平均值('value'))['value\uu Avg']

使用
序列化程序。SerializerMethodField
作为


from django.db.models import Avg


class CandidateSerializer(serializers.ModelSerializer):
    pk = serializers.SerializerMethodField('get_pk_from_candidate')
    full_name = serializers.SerializerMethodField('get_full_name_from_candidate')
    grades = serializers.SlugRelatedField(many=True, read_only=True, slug_field='value')
    avg_grade = serializers.SerializerMethodField()

    def get_avg_grade(self, candidate):
        return candidate.grades.aggregate(avg_value=Avg('value')).get("avg_value")

    class Meta:
        model = Candidate

        fields = ['pk', 'full_name', 'avg_grade', 'grades']

    def get_pk_from_candidate(self, candidate):
        return candidate.id

    def get_full_name_from_candidate(self, candidate):
        data = (candidate.first_name, candidate.last_name)
        full_name = ' '.join(data)

        return full_name

从django.db.models导入平均值
类候选序列化程序(serializers.ModelSerializer):
pk=serializers.SerializerMethodField('get_pk_from_candidate')
full\u name=serializers.SerializerMethodField('get\u full\u name\u from\u candidate')
grades=serializers.SlugRelatedField(many=True,read\u only=True,slug\u field='value')
avg_grade=serializers.SerializerMethodField()
def get_平均等级(自我、候选人):
返回候选者.grades.aggregate(平均值=avg('value')).get(“平均值”)
类元:
模型=候选人
字段=['pk'、'full_name'、'avg_grade'、'grades']
def从候选者(自我,候选者)处获取候选者:
返回候选者id
def从候选人(自我,候选人)处获取候选人全名:
数据=(候选者.名字,候选者.姓氏)
全名=''.join(数据)

返回全名
使用
序列化程序。SerializerMethodField
作为


from django.db.models import Avg


class CandidateSerializer(serializers.ModelSerializer):
    pk = serializers.SerializerMethodField('get_pk_from_candidate')
    full_name = serializers.SerializerMethodField('get_full_name_from_candidate')
    grades = serializers.SlugRelatedField(many=True, read_only=True, slug_field='value')
    avg_grade = serializers.SerializerMethodField()

    def get_avg_grade(self, candidate):
        return candidate.grades.aggregate(avg_value=Avg('value')).get("avg_value")

    class Meta:
        model = Candidate

        fields = ['pk', 'full_name', 'avg_grade', 'grades']

    def get_pk_from_candidate(self, candidate):
        return candidate.id

    def get_full_name_from_candidate(self, candidate):
        data = (candidate.first_name, candidate.last_name)
        full_name = ' '.join(data)

        return full_name

从django.db.models导入平均值
类候选序列化程序(serializers.ModelSerializer):
pk=serializers.SerializerMethodField('get_pk_from_candidate')
full\u name=serializers.SerializerMethodField('get\u full\u name\u from\u candidate')
grades=serializers.SlugRelatedField(many=True,read\u only=True,slug\u field='value')
avg_grade=serializers.SerializerMethodField()
def get_平均等级(自我、候选人):
返回候选者.grades.aggregate(平均值=avg('value')).get(“平均值”)
类元:
模型=候选人
字段=['pk'、'full_name'、'avg_grade'、'grades']
def从候选者(自我,候选者)处获取候选者:
返回候选者id
def从候选人(自我,候选人)处获取候选人全名:
数据=(候选者.名字,候选者.姓氏)
全名=''.join(数据)

return full_name
我试图写一个方法,在这个方法中我可以计算平均值,但我不知道如何处理我的成绩数组我试图写一个方法,在这个方法中我可以计算平均值,但我不知道如何处理我的成绩数组