【问题标题】:django-filter order_by "Cannot resolve keyword 'name' into field"django-filter order_by“无法将关键字'名称'解析为字段”
【发布时间】:2015-01-26 18:57:31
【问题描述】:

使用 django-filter,我有以下 FilterSet:

class MyFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(name='full_name')

    class Meta:
        model = MyModel
        fields = ['name',]
        order_by_field = 'order'
        order_by = ('name',)

如您所见,我已将该字段命名为 full_name,因此它会过滤表的 full_name 列。但是一旦我将order_by 设置为name,它就会给我这个错误:

无法将关键字“名称”解析为字段。选择是:...

它使用?name=Jon%20Doe 过滤,但排序不起作用。可能是什么问题?

【问题讨论】:

    标签: python django django-filter


    【解决方案1】:

    根据Meta.order_by 上的文档,您必须使用模型中的字段名称,而不是过滤字段名称。在你的情况下,我只会使用模型上的full_name:

    class MyFilter(django_filters.FilterSet):
        name = django_filters.CharFilter(name='full_name')
    
        class Meta:
            model = MyModel
            fields = ['name',]
            order_by_field = 'order'
            order_by = ('full_name',)
    

    如果你看一下代码:https://github.com/alex/django-filter/blob/develop/django_filters/filterset.py#L326-L339,你会看到如果你声明了一个 order_by 字段,它会遍历表单字段(从模型生成),然后使用该值作为 order_by 的参数在查询集上。

    如果有的话,文档应该更明确地说明这一事实。

    【讨论】:

    • 我没有看到任何明确说明它必须是 model 字段的内容。 order_by can be either a list or tuple of field names。见name
    • @norbertpy - 我的回答是正确的。我用解释更新了它。随意通过调试来验证结果,就像我测试时一样抛出打印语句。
    • 感谢您的解释。这是正确的。但是有一个问题,如何将查询字符串参数映射到列名以进行排序?我的意思是,我希望我的查询字符串具有?order=name,而是在模型上的full_name 列上进行排序。我该怎么做?
    • 过滤器的name(= 的左侧)是您传递给查询字符串的内容。 CharFilter(name=model_field_name) 中的名称。因此,您所拥有的对于您想要做的事情是正确的。
    • 因此,您可以有一个名为 i_like_cookies 的模型字段,但希望通过执行 likes_cookies = django_filters.CharField(name='i_like_cookies') 将查询字符串设为 ?likes_cookies=Yes|No 来简化它。
    猜你喜欢
    • 2021-09-17
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多