python - Django 休息框架 : child object count in serializer

标签 python django django-models django-rest-framework serialization

我需要计算一个对象拥有的子对象的数量,并通过对象序列化程序在我的 API 中返回该值。我还需要计算这些子对象的一个​​子集。

我有一个带有子代理人的任务对象。在我的 API 中,当我查询任务时,我希望返回以下数据集:

[
    { label: "Cross the bridge",
      count_assigned: 5,
      count_completed: 3 },
    { label: "Build a fire",
      count_assigned: 5,
      count_completed: 2 }
]

我该怎么做?我找到了 .annotate()方法,但该结果在序列化程序类中不可用。

模型.py

class Task(models.Model):
    label         = models.CharField(max_length=255,null=False,blank=False)

class Assignee(models.model):
    task         = models.ForeignKey(Task, related_name='assignees', on_delete=models.CASCADE, blank=True, null=True) 
    person       = models.ForeignKey(Person, on_delete=models.CASCADE, blank=True, null=True)
    completed    = models.DateTimeField(null=True,blank=True)

序列化器.py

from rest_framework import serializers

from .models import Task, Assignee
from people.serializers import PersonSerializer

class AssigneeSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()
    person = PersonSerializer(read_only=True)

    class Meta:
        model = Assignee

        fields = ('id','task','person','completed')
        read_only_fields = ['id']


class TaskSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField()

    class Meta:
        model = Task

        fields = ('id', 'label')
        read_only_fields = ['id']

最佳答案

建议的方式

class TaskSerializer(serializers.ModelSerializer):
     id = serializers.ReadOnlyField()
     count_assigned = serializers.SerializerMethodField()
     count_completed = serializers.SerializerMethodField()

     class Meta:
         model = Task
         fields = ('id', 'label', 'count_assigned', 'count_completed')

    def get_count_assigned(self, obj):
        return obj.assignees.count()

    def get_count_completed(self, obj):
        return obj.assignees.exclude(completed__isnull=True).count()

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

关于python - Django 休息框架 : child object count in serializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326237/

相关文章:

python - 在 Windows/Apache 上设置 Python?

Django Rest api 更改oauth响应错误格式

.update_or_create() 不使用 Django 1.8 自定义管理器和 .create() 方法

python - 即使在清除方法覆盖之后,表单字段仍然会错误地验证

python - 如何为 Django 中的所有模型编写 __str__ 方法的通用实现?

python - 添加不同大小/形状的置换 NumPy 矩阵

python - SciPy 中的约束优化

python - 使用 python 或 shell 解析原始文本数据并将其插入 mysql 数据库

python - 使用 values() 从 Django DateTimeField 获取年份

python - Django MySQL 完整性错误 : ("Field ' created_at' doesn't have a default value")