当前位置: 首页 > 知识库问答 >
问题:

通过SerializerMethodField筛选django REST结果

祁奇略
2023-03-14
class ImageSerializer(serializers.ModelSerializer):
    is_annotated = serializers.SerializerMethodField('has_annotation')

    class Meta:
        model = Image
        fields = '__all__'

    @staticmethod
    def has_annotation(image):
        return image.annotation_set.count() > 0
class ImageViewSet(viewsets.ModelViewSet):
    serializer_class = ImageSerializer
    lookup_field = 'id'
    permission_classes = [
        Or(IsAdmin),
        IsAuthenticated
    ]

    def get_queryset(self):
        queryset = Image.objects

        is_annotated_filter = self.request.query_params.get('is_annotated', None)
        if is_annotated_filter is not None:
            queryset = queryset.filter.annotate(
                cnt=Count('annotation')).filter(cnt__gte=1)

        queryset_order = get_queryset_order(self.request)
        return queryset.order_by(queryset_order).all()
  • http://www.django-rest-framework.org/api-guide/filtering/#filtering-abs-query-parameters
  • http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

共有1个答案

邹斌
2023-03-14

我想您误解了:1)序列化器MethodField,它的主要用途是只读的,并且序列化器不会用于筛选QuerySet。

我会更像这些来过滤:

from django.db.models import Count

queryset.filter.annotate(
    cnt=Count('annotation_set')
).filter(cnt__gte=1)

但是...你可以走得更好:

from django.db.models import Count
queryset = Image.objects.annotate(
    cnt_annotations=Count('annotation_set')
)
@staticmethod
def has_annotation(image):
    if hasattr(obj, 'has_annotation'):
        return bool(obj.cnt_annotations)
    else:
        return None
 类似资料:
  • 问题内容: 假设我有表,以及: 我想知道如何找到足球(30)和棒球(50)俱乐部中的所有学生。 虽然此查询不起作用,但这是我到目前为止最接近的东西: 问题答案: 我很好奇 众所周知,好奇心以杀死猫而闻名。 那么,哪一种最快的方法是给猫皮呢? 此测试的精确蒙皮环境: *Debian Squeeze上的 *PostgreSQL 9.0 ,具有不错的RAM和设置。 6.000名学生,24.000个俱乐部

  • 问题内容: 我已经查看了与该问题相关的Stack Overflow上的其他问题,但是似乎没有一个问题能清楚地回答这个问题。 我们有一个名为sp_who2的系统存储过程,该过程为服务器上所有正在运行的进程返回信息的结果集。我想过滤存储过程返回的数据;从概念上讲,我可能会这样做: 但是,该方法不起作用。有什么好的做法可以实现查询存储过程的返回数据的目标,最好无需查看原始存储过程的代码并对其进行修改。

  • 我现在有一只熊猫。数据帧,它有一个和一组值。 我想排除给定

  • 我有一个csv,它具有以下结构:

  • 我被安排了即将到来的测试作业,我需要在一个充满电影细节的数据库中搜索带有标点符号的片名。 我唯一的想法是用MySQL的in运算符查找其中带有特定标点符号的名称。 或者另一种方式: 但是,它在逻辑上是不正确的。当我筛选“.”/dot character/时,它也会返回带有“I”的标题。 你能帮帮我吗?提前谢谢!

  • 是否有一种方法可以使用来完成这一任务,而不需要为每个Patamenter组合创建大量/语句?