【问题标题】:Model property as a filter field in API模型属性作为 API 中的过滤器字段
【发布时间】:2018-10-09 05:57:41
【问题描述】:

我有这个模型:

class Auction(models.Model):
    start_price = models.IntegerField()
    price_step = models.IntegerField()
    finish_time = models.DateTimeField()

    @property
    def is_active(self):
        return self.finish_time > timezone.now()

我的序列化程序类中也有这个:

class AuctionSerializer(serializers.ModelSerializer):
    is_active = serializers.ReadOnlyField()

    class Meta:
        model = Auction
        fields = '__all__'

这在我的视图类中:

class AuctionViewSet(ModelViewSet):
    queryset = Auction.objects.all()
    serializer_class = AuctionSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('is_active',)

但它会抛出“'Meta.fields' 包含未在此 FilterSet 上定义的字段:is_active”。我可以将它用作序列化器字段,但我不能按此字段进行过滤。如何正确实现模型属性过滤,而不仅仅是模型字段?

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

AFAIK,django-filter 不支持按属性过滤。

这样做的一种方法是按原样公开模型;并期望 FE 进行相应的过滤。

例如:过滤器 URI 可能类似于 http://localhost:8000/api/auctions/?finish_time__gte=2018-04-28T00:00:00

但是,如果您想要一个显式声明;您可以覆盖ModelViewSet 中的get_queryset 方法,如下所示:

class AuctionViewSet(ModelViewSet):
    queryset = Auction.objects.all()
    serializer_class = AuctionSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('is_active',)

    def filter_active(qs):
        return qs.filter(finish_time__gte=timezone.now())

    def filter_inactive(qs):
        return qs.filter(finish_time__lt=timezone.now())

    def get_queryset():
        qs = super(AuctionViewSet, self).get_queryset()
        is_active = self.request.GET.get('is_active', None)  # This will be a string
        if is_active is None:
            pass
        elif is_active == 'true':
            qs = self.filter_active(qs)
        elif is_active == 'false':
            qs = self.filter_inactive(qs)
        else:
            pass  # Some other value
        return qs

参考: https://django-filter.readthedocs.io/en/master/guide/rest_framework.html#schema-generation-with-core-api

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2023-03-25
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多