【问题标题】:djangorestframework: Filtering in a related fielddjangorestframework:过滤相关字段
【发布时间】: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 一起使用)。

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

【问题讨论】:

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


    【解决方案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 ...
            ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 2018-12-30
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2019-11-10
      相关资源
      最近更新 更多