代码之家  ›  专栏  ›  技术社区  ›  blueFast

筛选有选项的字段

  •  0
  • blueFast  · 技术社区  · 7 年前

    operation = models.CharField(max_length=10, choices=OPERATIONS)
    

    使用此过滤器工作:

    class OperationFilter(django_filters.Filter):
    
        def filter(self, qs, value):
            try:
                qs = qs.filter(operation=value.upper())
            except:
                pass
            return qs
    

    带url:

    /api/v1/operation/?operation=CREATE
    

    但是有默认的过滤器(没有额外的 OperationFilter )失败原因:

    {
        "operation": [
            "Select a valid choice. %(value)s is not one of the available choices."
        ]
    }
    

    对于其他非选项字段,默认筛选器工作正常:

    /api/v1/operation/?recipient=recipient-19
    

    编辑

    OPERATIONS :

    from enum import Enum
    
    def enum_as_choices(enum_class):
        """From an enum class, generate choices for a django field"""
        return ((entry, entry.value) for entry in enum_class)
    
    class OperationType(Enum):
        CREATE = 'CREATE'
        STATUS = 'STATUS'
        EXPAND = 'EXPAND'
        DELETE = 'DELETE'
    
    OPERATIONS = enum_as_choices(OperationType)
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Mohsen Mahmoodi    7 年前

    您编写的选项将转换为此pythonic表示:

    (
        ('OperationType.CREATE', 'CREATE'), 
        ('OperationType.STATUS', 'STATUS'), 
        ('OperationType.EXPAND', 'EXPAND'), 
        ('OperationType.DELETE', 'DELETE')
    )
    

    'OperationType.CREATE' 等等。 所以你应该把你的选择改成普通的常量选择,或者你应该用类似 '操作类型.创建' 这不是一个好的选择。

    你也可以改变你的想法 enum_as_choices

    def enum_as_choices(enum_class):
        """From an enum class, generate choices for a django field"""
        return ((entry.name, entry.value) for entry in enum_class)
    
        2
  •  2
  •   Gabriel Muj    7 年前

    您正在使用 django_filters 包,我建议您阅读文档,因为您已经有了对此的支持

    https://django-filter.readthedocs.io/en/master/ref/filters.html#choicefilter

    只要指出你的观点 choices

        3
  •  0
  •   Daniel Holmes    7 年前

    OPERATIONS . 为此,添加如下内容:

    OPERATIONS = (
        ('', 'NONE'),
        # the rest of your choices here...
    )
    

    operation = models.CharField(max_length=10, choices=OPERATIONS, default='NONE')