我想使用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
结合使用。
谢谢
答案 0 :(得分:0)
status
是SmallIntegerField
,因此,您在数据库中拥有的是整数。当您提供这样的代码时:
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
,其余的应该是小菜一碟。