【问题标题】:Django/Djagno REST field lookup "range" does not return a range, but rather single value resultsDjango/Django REST 字段查找“范围”不返回范围,而是返回单值结果
【发布时间】:2021-05-21 07:42:09
【问题描述】:

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

例如:

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

urls.py

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

views.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)))

models.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,))

仅返回单个日期:

存在其他日期的对象:

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

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在代码中为了使用日期添加 __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)))

    【讨论】:

      【解决方案2】:

      由于我是盲人,在 urls.py 中我通过了: views.ActivityDateList.as_view() 而不是views.WeeklyActivityView.as_view()

      另外,我使用了渲染,但是没有要渲染的模板,因此应该出现“模板不存在”错误。正确的想法是省略 render()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多