首页 > 解决方案 > Django过滤所有分配的外键

问题描述

您好我想问一下如何过滤对象的所有分配的ForeignKeys。我的模型看起来像:

class Person(models.Model):
    name =  models.CharField(max_length=250)

class VirtualProject(models.Model):
    project_name = models.CharField(max_length=250)
    owner = models.ForeignKey(Person)

class Hours(models.Model):
    hours = models.FloatField()
    assigned_virtual_project = ForeignKey(VirtualProject)
    date = models.DateField()

我正在发送带有所有者和 dateRange 参数的 GET 请求,我想过滤分配给所有者的所有虚拟项目(这没问题,我可以得到这个)并且还获取分配给虚拟项目的所有小时对象并将所有小时数相加指定的日期范围。我怎么能这样做?对于前端,我使用的是 React,所以我使用的是 django rest 框架。到目前为止,我在视图中得到了什么:

class GetDataView(viewsets.ModelViewSet):
    serializer_class = DataSerializer
    
    def get_queryset(self):
       owner = self.request.query_params.get('owner')
       dateRange = self.request.query_params.get('dateRange')

       queryset = VirtualProject.objects.filter(owner=owner)
       return queryset

编辑:

序列化器.py:

class VirtualProjectSerializer(serializers.ModelSerializer):
         class Meta:
             model = VirtualProject
             fields = '__all__'

标签: pythondjangodjango-rest-frameworkdjango-filter

解决方案


您可以简单地SerializerMethodField在序列化程序中使用 a ,与总和聚合查询相关联。

from django.db.models import Sum
from models import Hours

class VirtualProjectSerializer(serializers.ModelSerializer):
         hours = serializers.SerializerMethodField()

         class Meta:
             model = VirtualProject
             fields = '__all__'

         def get_hours(self, obj):
             qs = Hours.objects.filter(assigned_virtual_project=obj).aggregate(Sum(hours))
             return qs
      

请注意,这将是只读的,我相信这就是您想要的。


推荐阅读