如何使用显示名称搜索选择字段?

时间:2019-07-16 13:55:55

标签: django filter choicefield

我想使用Django SmallIntegerField从数据库中查询项目。我使用的代码是

这是班级定义:

class Equipment(models.Model):
    asset_status = (
        (0, 'online'),
        (1, 'offline'),
        (2, 'unknown'),
        (3, 'wrong'),
        (4, 'x'),
    )
status = models.SmallIntegerField(
        choices=asset_status, default=0, verbose_name='Device Status')

我使用的查询代码是

def filter_queryset(self, qs):
    sSearch = self.request.GET.get('search[value]', None)
    print(sSearch)
    if sSearch:
        qs = qs.filter(Q(status__icontains=sSearch))
        return qs

我想通过“在线”,“离线”等查询此列。你知道怎么做吗?

我搜索的参考是

Search choice field by the name in django - python

我还看到了Choices API https://django-model-utils.readthedocs.io/en/latest/utilities.html#choices

但是没有Q。我不确定是否可行。你能告诉我这个吗?

我搜索了一种名为get_FOO_display的方法,但我认为无法解决。我也认为它不能与Q结合使用。

谢谢

2 个答案:

答案 0 :(得分:0)

statusSmallIntegerField,因此,您在数据库中拥有的是整数。当您提供这样的代码时:

asset_status = (
    (0, 'online'),
    (1, 'offline'),
    (2, 'unknown'),
    (3, 'wrong'),
    (4, 'x'),
)

您正在告诉Django:“嘿,我希望能够显示,将0选项值显示为'online',将1选项值显示为'offline'...”,依此类推。

因此,您Django不会将此类值(“ online”,“ offline”,...)写入数据库,因此您无法查询它们

但是...

我想在用户选择过滤选项之一之后,您很难为查询获取正确的整数值,您应该看看ChoiceField,也许可以将其用于过滤器表单。

答案 1 :(得分:0)

选择遵循actual_value_for_db, human_readable_name元组的格式,其中human_readable_name仅用于显示目的。也就是说,您不能查询它,因为元组的第一项仅存储在数据库中。

如果您想更轻松地找到需要使用的值,可以使用类似枚举的声明:

class Equipment(models.Model):
    ONLINE = 0
    OFFLINE = 1
    UNKNOWN = 2
    WRONG = 3
    X = 4

    asset_status = (
        (ONLINE, 'online'),
        (OFFLINE, 'offline'),
        (UNKNOWN, 'unknown'),
        (WRONG, 'wrong'),
        (X, 'x'),
    )

然后,您可以使用Equipment模型的成员的“名称”来查询选择:Equipment.objects.filter(status=Equipment.OFFLINE)

目前尚不清楚request中的值到底是什么以及它的来源。我建议仅使用ModelForm向用户询问正确的状态类型。 ModelForm应该照顾该formfield的选择,并为所选的选择返回正确的类型(应该是整数,而不是字符串!)。使用通用的FormView,其余的应该是小菜一碟。