首页 > 解决方案 > Django/Djagno REST 字段查找“范围”不返回范围,而是返回单值结果

问题描述

我正在尝试返回一系列包含日期属性的对象。使用字段查找范围,它只返回具有起始范围的对象。

例如:

如果范围的开始等于 2021-05-19,范围的结束等于 2021-05-21,则仅返回日期为 2021-05-19 的对象。

网址.py

urlpatterns = [
    ...
    path('weekly/<str:activity_date>/', views.ActivityDateList.as_view(), name='weekly_dates'),
    ...
]

视图.py

from django.shortcuts import render
from rest_framework import generics
from .serializers import ActivityListSerializer
from .models import Activity
from keeper import serializers
...

class WeeklyActivityView(generics.ListAPIView):
    serializer_class = ActivityListSerializer

    def get_queryset(self):
        end_of_week = "2021-05-21" # Temporary test date
        activity_date = self.kwargs['activity_date']

        return render(Activity.objects.filter(activity_date__range=(activity_date, end_of_week)))

模型.py

class Activity(models.Model):
    activity_name = models.CharField(max_length=200, blank=False)
    activity_duration = models.CharField(max_length=300, blank=False)
    activity_date = models.DateField(auto_now=False, blank=False)

    def __str__(self):
        return f"Activity: {self.activity_name} Started at: {self.activity_start} Activity Duration: {self.activity_duration}"

序列化程序.py

from rest_framework import serializers
from .models import Activity
from rest_framework.reverse import reverse

class ActivityListSerializer(serializers.ModelSerializer):
    absolute_url = serializers.SerializerMethodField()

    class Meta:
        model = Activity
        fields = [
            'activity_name',
            'activity_duration',
            'activity_date',
            'absolute_url'
        ]

    def get_absolute_url(self, obj):
        return reverse('activities_detail', args=(obj.pk,))

仅返回单个日期: 输出

存在其他日期的对象:

其他对象

如何返回指定范围内日期属性的对象?

标签: pythondjangodjango-rest-framework

解决方案


在代码中为了使用日期添加 __date 到字段

return render(Activity.objects.filter(activity_date__range=(activity_date, end_of_week)))

用。。。来代替

return render(Activity.objects.filter(activity_date__date__range=(activity_date, end_of_week)))


推荐阅读