【问题标题】:DRF serializer filteringDRF 串行器滤波
【发布时间】:2018-03-16 21:08:56
【问题描述】:

我有一个序列化程序,一切正常。

ModelClassASerializer((serializers.ModelSerializer)):
   .....

   status = serializers.SerializerMethodField()


   def get_status(self, obj):
       ....
       status = ModelB.objects.get(id=obj.id).status
       ....
       return status

   class Meta:
       model = ModelClassA
       fields = (...)

但如果我想根据该状态进行过滤,我不能。我正在使用 django_filters.rest_framework.FilterSet 进行过滤。模型之间没有关系。

进行过滤的最佳方法是什么?

【问题讨论】:

  • 您的模型如何关联?可以给我看看吗,或许source可以帮到你。
  • 对不起,忘了说两个模型之间没有任何关系。更新了我的问题。已经检查了文档,但找不到答案。
  • 您提供了一个代码示例,但不清楚您正在尝试/想要做什么。特别是为什么要在序列化程序中进行过滤。过滤通常适用于视图中的数据集,为什么在您的情况下有所不同?
  • 示例:现在,当我查询 localhost:8000/someurl/ 时,我得到了所有记录。感谢序列化程序中的 get_status 函数,我也得到了状态。我想查询 localhost:8000/someurl/?status=1 并获取所有 status=1 的记录。但由于我们没有 fk,我无法让过滤变得如此简单。
  • 使用 DRF 创建自定义通用过滤这里是django-rest-framework.org/api-guide/filtering/…

标签: django django-rest-framework django-filter django-filters


【解决方案1】:

看起来ModelA 中的对象与ModelB 中的对象共享相同的 ID。如果是这种情况,您可以使用子查询来匹配 ID。如果 ID 彼此不对应,则此查询将是无意义的。您要创建以下查询集:

from django.db.models import Subquery
from myapp.models import ModelA, ModelB

pks = ModelB.objects.filter(status='foo').values('pk')
ModelA.objects.filter(pk__in=Subquery(pks))

要创建上述 django 过滤器,您需要在过滤器上使用 method 参数。

from django_filters import rest_framework as filters

class ModelAFilter(filters.FilterSet):
    status = filters.ChoiceFilter(choices=(('foo', 'Foo'), ...), method='filter_status')

    class Meta:
        model = ModelA
        fields = []

    def filter_status(self, queryset, name, value):
        pks = ModelB.objects.filter(status=value).values('pk')
        return queryset.filter(pk__in=Subquery(pks))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2014-04-26
    • 2019-07-25
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多