Python DRF ModelViewSet queryset返回日期大于或等于今天的结果

Python DRF ModelViewSet queryset返回日期大于或等于今天的结果,python,django,django-rest-framework,django-rest-viewsets,drf-queryset,Python,Django,Django Rest Framework,Django Rest Viewsets,Drf Queryset,我正在使用Django Rest框架 在queryset中,我试图根据对象的日期是否大于或等于今天来过滤对象。像这样: class DateViewSet(viewsets.ModelViewSet): """ API Endpoint to retrieve all dates after today. """ serializer_class = DateSerializer today = datetime.date.today() quer

我正在使用Django Rest框架

在queryset中,我试图根据对象的日期是否大于或等于今天来过滤对象。像这样:

class DateViewSet(viewsets.ModelViewSet):
    """
    API Endpoint to retrieve all dates after today.
    """
    serializer_class = DateSerializer
    today = datetime.date.today()
    queryset = EventDate.objects.filter(end_date__gte=today)
但这最后也显示了过去的日期

我的序列化程序:

class DateSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventDate
        fields = ('start_date', 'end_date')
class EventSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.StringRelatedField()
    dates = DateSerializer(many=True, read_only=True)

    class Meta:
        model = Event
        fields = '__all__'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'},
        }
然后我将其传递给事件序列化程序:

class DateSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventDate
        fields = ('start_date', 'end_date')
class EventSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.StringRelatedField()
    dates = DateSerializer(many=True, read_only=True)

    class Meta:
        model = Event
        fields = '__all__'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'},
        }
我的目标是,当API返回所有事件时,它不应该返回过去的所有日期

我做错了什么?

问题是,today=datetime.date.today将在构建类时进行计算,而不是每次需要获取这些属性时进行计算

您可以覆盖get_queryset方法,以获取并使用请求发出的日期进行查询:

from django.utils.timezone import now

class DateViewSet(viewsets.ModelViewSet):
    """
    API Endpoint to retrieve all dates after today.
    """
    serializer_class = DateSerializer

    def get_queryset(self, *args, **kwargs):
        EventDate.objects.filter(end_date__gte=now().date())
问题是,today=datetime.date.today将在构造类时计算,而不是每次需要获取这些属性时计算

您可以覆盖get_queryset方法,以获取并使用请求发出的日期进行查询:

from django.utils.timezone import now

class DateViewSet(viewsets.ModelViewSet):
    """
    API Endpoint to retrieve all dates after today.
    """
    serializer_class = DateSerializer

    def get_queryset(self, *args, **kwargs):
        EventDate.objects.filter(end_date__gte=now().date())

很好的回答解释。嘿,威廉,谢谢你的回答!我现在的问题是queryset不影响EventSerializer dates=DateSerializer中的值。我的目标是筛选日期并将其传递给EventSerializer@TonyKyriakidis:但是我想你需要一个EventViewSet?您可以使用Event.objects.filtereventdate\uu end\u date\uu gte=now.date进行筛选,其中eventdate是事件到eventdate的外键,这可能是另一个名称。回答得很好。嘿,Willem,感谢您的回复!我现在的问题是queryset不影响EventSerializer dates=DateSerializer中的值。我的目标是筛选日期并将其传递给EventSerializer@TonyKyriakidis:但是我想你需要一个EventViewSet?您可以使用Event.objects.filtereventdate\uuu end\u date\uuu gte=now.date进行筛选。如果eventdate是事件到eventdate的外键,则可能是另一个名称。