【问题标题】:How to filter Django REST Framework queryset by foreign key of nested object?如何通过嵌套对象的外键过滤 Django REST Framework 查询集?
【发布时间】:2021-09-21 04:23:09
【问题描述】:

我有以下 Django 模型:

class Pa(models.Model):
   pa_name = models.CharField

class Pb(models.Model):
    pa = models.ForeignKey(Pa, related_name="pbs")
    pb_name = models.CharField()

class Pc(models.Model):
    pb = models.ForeignKey(Pb, related_name="pcs")
    pc_name = models.CharField()

Pc 的查询集有这样的结构:

[
  { "id": 1,
    "pc_name": "pc_1",
    "pb" = {
      "id": 10,
      "pb_name": "pb_1",
      "pa" : {
        "pa_name" : "pa_1"  # <-- How to filter queryset by pa_name attribute?
      }
    }
  },
  { "id": 2,
    "pc_name": "pc_2",
    "pb" = {
      "id": 20,
      "pb_name": "pb_2",
      "pa" : {
        "pa_name" : "pa_2"
      }
    }
  },
  # ...
]

我想返回所有Pcs,其中pa_name"pa_1",即过滤 2. 级嵌套对象。

【问题讨论】:

    标签: django django-rest-framework drf-queryset


    【解决方案1】:

    可以使用链式过滤器:

    pcs = Pc.objects.filter(pb__pa__pa_name=pa_name)
    

    【讨论】:

      【解决方案2】:

      您可以编写自己的过滤器类,然后定义要过滤的内容:

      import django_filters.rest_framework
      import django_filters.filters
      
      class FilterClass(django_filters.rest_framework.FilterSet):
          pb = django_filters.CharFilter(
              method="filter_pa", label="Pa filter"
          )
          class Meta:
              model = models.Pc
              fields = { 
                  "pc_name": ["icontains"],
              }
          
          def filter_pb(self, queryset, field_name, value):
              return queryset.filter(
                  pb__pb_name__icontains=value
              ).distinct()
      
      class PC(APIView):
          filterset_class = FilterClass
      

      因此,此过滤器集将允许您过滤您的pb_name。希望这个答案能帮助您解决问题。

      【讨论】:

        猜你喜欢
        • 2014-01-08
        • 2015-09-21
        • 2019-07-11
        • 2020-09-25
        • 2021-06-25
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多