class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
def get_queryset(self):
return super().get_queryset().annotate(
is_active=ExpressionWrapper(
Q(start_date__lt=timezone.now()) & Q(end_date__gt=timezone.now()),
output_field=BooleanField()
),
)
search_fields = [
'name',
'short_desc',
'desc',
]
filterset_fields = [
'is_active',
]
У меня есть этот ViewSet, который я хочу отфильтровать по аннотированному полю, обычно вы можете просто фильтровать аннотацию в наборах запросов django, однако вышеперечисленное в сочетании с этим сериализатором:
class EventSerializer(serializers.ModelSerializer):
is_active = serializers.SerializerMethodField()
@staticmethod
def get_is_active(obj):
return obj.is_active
class Meta:
model = Event
fields = [
'timestamp',
'id',
'name',
'short_desc',
'desc',
'start_date',
'end_date',
'is_active',
]
Я не углублялся в исходный код, но предположил бы, что он сделает простой qs.filter для полей в filterset_fields
, но я получаю эту прекрасную ошибку, которая не может объяснить многое (по крайней мере, мне):
'Meta.fields' contains fields that are not defined on this FilterSet: is_active