将自定义过滤器与 Django ModelChoice 过滤器结合使用

Cry*_*tal 5 python django django-filters

我正在尝试使用 django-filters 创建使用过滤器方法

请参阅以下模型的示例:

class Chicken(TimeStampedModel):
    eggs = ForeignKey(Egg)

class Egg(TimeStampedModel):
    hatched = BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

请参阅我当前的过滤器设置示例:

class ChickenFilter(FilterSet):
    eggs__contains = ModelChoiceFilter(name="eggs", method='hatched_eggs', queryset=Eggs.objects.all())

   def hatched_eggs(self, queryset, name, value):
      print "We got eggs"
     return queryset.filter(eggs__hatched=True)
Run Code Online (Sandbox Code Playgroud)

问题是当我点击 url 时,该方法甚至不打印 We got Eggs。它只返回一个空的查询集。

小智 6

我这样做如下:

在我发送的网址中 ?ids=1,2,3,4

class MyFilter(filters.FilterSet):
    ids = django_filters.CharFilter(method='ids__in')

    def ids__in(self, queryset, value, *args, **kwargs):
        try:
            if args:
                ids = args[0].split(',')
                ids = [int(_id) for _id in ids]
                queryset = queryset.filter(id__in=ids)
        except ValueError:
            pass
        return queryset
Run Code Online (Sandbox Code Playgroud)


Ann*_*ess 4

我正在经历同样的问题。我的method没有被叫到。

所以得出结论,我可以使用以下方法解决问题:

在 django-rest-framework 的过滤器中使用自定义方法

class ChickenFilter(FilterSet):
    eggs__contains = CharFilter(action='hatched_eggs')

def hatched_eggs(queryset, value):
      print "We got eggs"
     if value:
         return queryset.filter(eggs__hatched=True)
     return queryset
Run Code Online (Sandbox Code Playgroud)