djangorestframework:在相关字段中过滤

时间:2013-09-05 00:15:03

标签: django django-models django-rest-framework

基本上,我想从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一起使用)。

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

2 个答案:

答案 0 :(得分:26)

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

一些伪代码,其中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(这是一个优化)。

答案 1 :(得分:0)

一种方法是在Model本身上创建一个方法,并在序列化程序中对其进行引用:

#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 ...
        ]