如何在JSONField上使用django筛选器

如何在JSONField上使用django筛选器,django,django-models,django-rest-framework,django-forms,django-templates,Django,Django Models,Django Rest Framework,Django Forms,Django Templates,django-filter在模型的所有默认字段上都能很好地工作,但当我们想在postgres字段(如JSONField)上使用它时,问题就来了 我有以下型号: from django.contrib.postgres.fields import JSONField,ArrayField class MyModel(models.Model): j_field = JSONField(blank=True,null=True,default=dict) j_字段的数据结构如下: [{"

django-filter
在模型的所有默认字段上都能很好地工作,但当我们想在postgres字段(如JSONField)上使用它时,问题就来了

我有以下型号:

from django.contrib.postgres.fields import JSONField,ArrayField

class MyModel(models.Model):
    j_field = JSONField(blank=True,null=True,default=dict)
j_字段
的数据结构如下:

[{"name":"john","work":"developer"},{"name":"cena","work":"teacher"}]
  • 如何使用
    django filter
    根据
    j_字段中的
    name
    work
    过滤结果

基本上,您需要创建一个自定义方法进行筛选:

import django_filters

class MyModelFilter(django_filters.FilterSet)

    class Meta:
        model = MyModel 
        fields = ('name', 'work')


    name = django_filters.CharFilter(
        method='name_filter'
    )

    work = django_filters.CharFilter(
        method='work_filter'
    )

    def name_filter(self, queryset, name, value):
        return queryset.filter(j_field__name__iexact=value)

    def work_filter(self, queryset, name, value):
        return queryset.filter(j_field__work__iexact=value)

对于答案,我有点困惑,比如如何在视图中实现它,下面是我正在做的:
https://pastebin.com/raw/zrSAXJuA
,您能帮我更正一个代码片段,以便在template.work\u filter()和name\u filter()上实现它吗接受3个位置参数,但在尝试
http://localhost:9200/pfilter?work=teacher
对不起,添加
self
作为第一个参数。我更新了答案
import django_filters

class MyModelFilter(django_filters.FilterSet)

    class Meta:
        model = MyModel 
        fields = ('name', 'work')


    name = django_filters.CharFilter(
        method='name_filter'
    )

    work = django_filters.CharFilter(
        method='work_filter'
    )

    def name_filter(self, queryset, name, value):
        return queryset.filter(j_field__name__iexact=value)

    def work_filter(self, queryset, name, value):
        return queryset.filter(j_field__work__iexact=value)