【问题标题】:Django filter all assigned foreing keysDjango过滤所有分配的外键
【发布时间】:2021-04-17 06:45:40
【问题描述】:

你好我想问一下如何过滤对象的所有分配的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__'

【问题讨论】:

  • 您希望 API 的响应包含每个 VirtualProject 的所有小时数?或将所有 VirtualProject 匹配查询集的所有时间相加?
  • 我想根据所有者字段回复每个 VirtualProject 的所有时间
  • 您可以在您的问题中添加 DataSerializer 代码吗? @pipikej

标签: python django django-rest-framework django-filter


【解决方案1】:

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

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
      

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

【讨论】:

  • 有了这个我收到的小时数不是从聚合(总和(小时))中定义的。我试图将其编辑为:Sum('hours')。但我收到 KeyError: 'hours_sum'
  • 当我将 return qs[hours_sum] 更改为 return qs 时,它正在工作。它将 "hours": { "hours__sum": value }, 添加到 API。
  • 哦,好吧,也许在上面的行中添加 [hours_sum] 是可行的,但我没有尝试。我用您提供的内容编辑我的答案。
  • 非常感谢您的宝贵时间!
  • 另外我想问一下是否有任何方法可以将参数从 GET 请求传递给序列化程序,因为我不想总结所有时间,而只想从指定月份开始,因为我正在发送 dateRange ?我试图过滤视图,但效果不佳。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-09-07
  • 2012-01-23
  • 1970-01-01
  • 2018-01-05
  • 2013-09-05
  • 2016-07-12
  • 2013-09-04
  • 2021-01-26
相关资源
最近更新 更多