djangorestframework:过滤相关字段

Posted

技术标签:

【中文标题】djangorestframework:过滤相关字段【英文标题】:djangorestframework: Filtering in a related field 【发布时间】:2013-09-08 16:00:13 【问题描述】:

基本上,我想从 ModelSerializer 的相关字段中过滤掉非活动用户。我尝试了Dynamically limiting queryset of related field 以及以下内容:

class MySerializer(serializers.ModelSerializer):
  users = serializers.PrimaryKeyRelatedField(queryset=User.objects.filter(active=True), many=True)
  class Meta:
    model = MyModel
    fields = ('users',)

这些方法都不能仅用于过滤查询集。我想将嵌套相关的 Serializer 类作为字段执行此操作(但甚至无法使其与 RelatedField 一起使用)。

如何过滤嵌套关系的查询集?

【问题讨论】:

【参考方案1】:

我也很想看到更好的解决方案。我在我的序列化程序中使用了一个自定义方法来做到这一点。它有点冗长,但至少它是明确的。

GarageSerializer 过滤汽车嵌套关系的一些伪代码:

class MyGarageSerializer(...):
    users = serializers.SerializerMethodField('get_cars')

    def get_cars(self, garage):
        cars_queryset = Car.objects.all().filter(Q(garage=garage) | ...).select_related()
        serializer = CarSerializer(instance=cars_queryset, many=True, context=self.context)

        return serializer.data

显然用你想要的任何东西替换查询集。您并不总是需要提供上下文(我用它来检索嵌套序列化程序中的一些查询参数),并且您可能不需要 .select_related (这是一种优化)。

【讨论】:

出于我的目的,目前这是一个非常好的解决方法。但是,像您一样,我很想知道是否有更好的解决方案:) 不幸的是,这种方法只适用于只读字段。正在寻找一个对编写也很友好的解决方案。 @dbro - 是的,这是只读的。自那个项目(2013 年)以来我没有使用过 DRF,所以我无能为力。您可能想问一个新问题。【参考方案2】:

一种方法是在模型本身上创建一个方法并在序列化程序中引用它:

#Models.py
class MyModel(models.Model):
    #...
    def my_filtered_field (self):
            return self.othermodel_set.filter(field_a = 'value_a').order_by('field_b')[:10]
#Serialziers.py
class MyModelSerialzer(serializers.ModelSerializer):
    my_filtered_field = OtherModelSerializer (many=True, read_only=True)
    class Meta:
        model   = MyModel
        fields  = [
            'my_filtered_field'             ,
            #Other fields ...
        ]

【讨论】:

以上是关于djangorestframework:过滤相关字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django Rest Framework 中过滤嵌套的序列化程序?

Django Rest Framework(多对多字段上的 GET 过滤器)

如何使用 Django Rest Framework 过滤器将过滤器链接在一起

Django REST Framework 中的否定或排除过滤器

前端实现敏感字过滤

Django rest框架按日期时间过滤