33

基本上,我想从 ModelSerializer 的相关字段中过滤掉非活动用户。我尝试了动态限制相关字段的查询集以及以下内容:

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

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

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

4

2 回答 2

36

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

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 (这是一种优化)。

于 2013-09-05T03:53:13.030 回答
3

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

#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 ...
        ]
于 2020-10-06T07:50:56.333 回答