Django 复杂查询

时间:2021-04-14 08:27:09

标签: django django-rest-framework django-queryset

我在我的 Django 应用程序中使用 django restframework,我需要创建非常具体的查询。

这是models.py:

class TaskHours(models.Model):
    name = models.CharField(max_length=100)
    hours = models.FloatField()
    task = models.CharField(max_length=100)
    date = models.DateField()

views.py:

class TaskHoursView(generics.ListAPIView):
   serializer_class = TaskHoursSerializer
   queryset = TaskHours.objects.all()
   
   def get_queryset(self):
       start_date = self.request.query_params.get('start_date')
       end_date = self.request.query_params.get('end_date')
       return TaskHours.filter(date__range=[start_date, end_date])

并且序列化器是默认的,带有所有字段的 Meta 类。

此查询工作正常,但我需要更改它。在数据中有具有相同名称和相同日期但不同任务的条目。我需要的是将具有相同名称和日期的所有任务和工作时间分配给一个对象,如下所示:

{
    "name": "John",
    "date": "2021-04-14",
    "task": "cleaning",
    "hours": "4.5",
    "task": "hoovering",
    "hours": "2.0"
}

现在我收到它是这样的:

{
    "name": "John",
    "date": "2021-04-14",
    "task": "cleaning",
    "hours": "4.5",
},
{
    "name": "John",
    "date": "2021-04-14",
    "task": "hoovering",
    "hours": "2.0"
}

有什么办法可以将两个对象合二为一吗?

1 个答案:

答案 0 :(得分:1)

您需要稍微修改您的序列化程序,以便为您要序列化的每个对象创建一个子查询。

class TaskHoursSerializer(serializers.ModelSerializer):
    tasks = serializers.SerializerMethodField()

    class Meta:
        model = TaskHours
        exclude = ['task', 'hour']

    def get_tasks(self, obj):
        tasks = TaskHours.objects.filter(name=obj.name, date=obj.date).values_list("task", "hour")
        return list(tasks)

此外,您需要更改视图中的查询集,以免对象重复。

class TaskHoursView(generics.ListAPIView):
   serializer_class = TaskHoursSerializer
   queryset = TaskHours.objects.all()
   
   def get_queryset(self):
       start_date = self.request.query_params.get('start_date')
       end_date = self.request.query_params.get('end_date')
       return TaskHours.filter(date__range=[start_date, end_date]).values('name', 'date').distinct()

这应该输出一个名为“tasks”的字段,其中包含具有匹配小时的每个任务。

相关问题