Django 复杂查询
Django Complicated Query
我在我的 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])
并且序列化程序是默认的 class 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"
}
有什么方法可以将两个对象合二为一吗?
您需要稍微修改您的序列化程序,以便为您要序列化的每个对象创建一个子查询。
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”的字段,其中包含具有匹配小时数的每个任务。
我在我的 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])
并且序列化程序是默认的 class 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"
}
有什么方法可以将两个对象合二为一吗?
您需要稍微修改您的序列化程序,以便为您要序列化的每个对象创建一个子查询。
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”的字段,其中包含具有匹配小时数的每个任务。