Python Django筛选所有分配的外键
您好,我想问一下如何过滤对象的所有指定外键。我的模型看起来像:Python Django筛选所有分配的外键,python,django,django-rest-framework,django-filter,Python,Django,Django Rest Framework,Django Filter,您好,我想问一下如何过滤对象的所有指定外键。我的模型看起来像: 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(model
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()
我正在发送带有owner和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
编辑:
Serializers.py:
class VirtualProjectSerializer(serializers.ModelSerializer):
class Meta:
model = VirtualProject
fields = '__all__'
您只需在序列化程序中使用与总和聚合查询关联的
从django.db.models导入总和
从模型导入时间
类VirtualProjectSerializer(serializers.ModelSerializer):
小时数=序列化程序。SerializerMethodField()
类元:
模型=虚拟项目
字段='\uuuu所有\uuuu'
def get_小时数(自身、obj):
qs=Hours.objects.filter(分配的虚拟项目=obj).aggregate(总和(小时))
返回qs
请注意,这将是只读的,我相信这正是您想要的。您希望API的响应包含每个
虚拟项目的所有小时数总和。
?或者合计所有VirtualProject
match queryset的所有小时数?我想根据所有者字段回复每个VirtualProject的所有小时数。您可以在问题中添加DataSerializer代码吗@pipikej@BriseBalloches已更新。在此情况下,我收到的小时数不是从聚合中定义的(总和(小时))。我将其编辑为:Sum('hours')。但当我将return qs[hours\u sum]
更改为return qs
时,我收到keyrerror:“hours\u sum”,然后它就开始工作了。它将这个“hours”:{“hours\u sum”:value},
添加到API中。哦,好吧,也许将[hours\u sum]添加到上面的行是可行的,但我没有尝试。我用你提供的内容编辑我的答案。非常感谢你抽出时间!另外,我想询问是否有任何方法可以将参数从GET请求传递到序列化程序,因为我不想对所有小时进行求和,而只想在发送日期范围时对指定月份的小时进行求和?我试图过滤视图,但效果不太好。非常感谢。