【问题标题】:How to use django-filter on JSONField如何在 JSONField 上使用 django-filter
【发布时间】:2020-03-17 13:21:20
【问题描述】:

django-filter 在 Model 的所有默认字段上都可以正常工作,但是当我们想在 JSONField 等 postgres 字段上工作时就会出现问题

我有以下型号:

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

class MyModel(models.Model):
    j_field = JSONField(blank=True,null=True,default=dict)

j_field 的数据结构如下:

[{"name":"john","work":"developer"},{"name":"cena","work":"teacher"}]
  • 如何使用django-filter 过滤来自j_fieldnamework 的结果?
import django_filters

class MyModelFilter(django_filters.FilterSet)
  class Meta:
      model = MyModel 
        ...
        ...
        what's next?

【问题讨论】:

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


    【解决方案1】:

    基本上你需要创建一个自定义方法来过滤:

    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)
    

    【讨论】:

    • TY 回答,我对如何在视图中实现这一点有点困惑,这就是我正在做的事情:https://pastebin.com/raw/zrSAXJuA,你能帮我纠正一个 sn-p 来实现吗它在模板上。
    • work_filter() 和 name_filter() 采用 3 个位置参数,但在尝试http://localhost:9200/pfilter?work=teacher时给出了 4 个参数
    • 对不起,添加self作为第一个参数。我更新了答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2020-11-06
    • 2017-06-21
    • 2017-07-03
    • 2011-04-13
    • 2021-03-25
    相关资源
    最近更新 更多