使用 django_property_filter 但 PropertyChoiceFilter 在 Inactive 上无法匹配

Posted

技术标签:

【中文标题】使用 django_property_filter 但 PropertyChoiceFilter 在 Inactive 上无法匹配【英文标题】:Using django_property_filter but PropertyChoiceFilter failing to match on Inactive 【发布时间】:2021-06-15 09:10:38 【问题描述】:

我无法弄清楚我在这里做错了什么。我正在使用 django_property_filter 将过滤器添加到我的员工列表中。

我有一个 Employee 模型来扩展 User 模型。它具有 is_active 属性,用于返回用户模型的 is_active 值。

class Employee(models.Model):
"""Model representing an employee - one-to-one with user"""
user = models.OneToOneField(User, on_delete=models.CASCADE)

@property
def is_active(self):
    """Property to return active status of user to employee model"""
    return self.user.is_active  

我有一个使用 django_property_filter 的属性过滤器

class EmployeeFilter(PropertyFilterSet):

ACTIVE_CHOICES = (
(True, 'Active'),
(False, 'Inactive'),
)

active = PropertyChoiceFilter(choices=ACTIVE_CHOICES,field_name='is_active',lookup_expr='exact',label='Active')

class Meta:
    model = Employee
    fields = ['locations']

我正在使用基于函数的视图来列出所有员工。

def EmployeesList(request):
    
employee=getemployeefromuser(request)
if employee:
    
    emp_list = Employee.objects.filter(hotel__exact=employee.hotel).order_by('user')
    f = EmployeeFilter(request.GET, queryset=emp_list)
    emp_list = f.qs
     
    paginator = Paginator(emp_list, 20)
    page = request.GET.get('page', 1)
    try:
       emps = paginator.page(page)
    except PageNotAnInteger:
       emps = paginator.page(1)
    except EmptyPage:
       emps = paginator.page(paginator.num_pages)

    context = 
    'filter':f,
    'emps':emps,
    

return render(request, 'staffapp/employee_list.html', context=context)

过滤器按预期显示。位置过滤器工作正常。主动过滤器适用于 ----/None 和 Active/True,但是当我选择 Inactive 时,它​​只会返回与 Active 相同的结果。 URL 正确附加了“?Active=False”,但生成的员工记录与附加“?Active=True”时的结果相同。

更新: 如果我使用 PropertyBooleanFilter 而不是 PropertyChoiceFilter,我可以让它在功能上正常工作。但是呈现给用户的选项令人困惑(未知/是/否),因此它具有功能性但不实用。

#this works but options unknown/yes/no are not intuitive to users
isactive = PropertyBooleanFilter(field_name='is_active',lookup_expr='exact',label='Active')

我还没有找到任何方法来覆盖 PropertyBooleanFilter 的下拉选项。

【问题讨论】:

【参考方案1】:

已与 django_property_filter 的开发人员确认这是一个缺陷。

建议的解决方法是使用带有 property_boolean_filter 的布尔小部件。

ACTIVE_CHOICES = (
(None, 'All'),
(True, 'Active'),
(False, 'Inactive'),
)
my_widget = BooleanWidget()
my_widget.choices = ACTIVE_CHOICES

isactive = PropertyBooleanFilter(widget=my_widget, 
field_name='is_active',lookup_expr='exact',label='Active')

【讨论】:

以上是关于使用 django_property_filter 但 PropertyChoiceFilter 在 Inactive 上无法匹配的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份