django - 无法通过 Django 中的 BooleanField 过滤对象
问题描述
我正在构建一个提醒并尝试通过名为“状态”的 BooleanField 过滤任务对象。
如您所见,我已将 Task.objects.filter(status=False) 分配给 undo_tasks,但是当我运行它时,出现此错误: ProgrammingError at /showing-all-tasks/ argument of NOT must be type boolean, not键入字符不同的第 1 行:...“状态”,“任务”。“提醒”来自“任务”,而不是“任务”。“st...
这是在 postgres 中运行的查询:SELECT "task"."id", "task"."user_id", "task"."title", "task"."slug", "task"."description", "任务”。“截止日期”,“任务”。“日期编辑”,“任务”。“状态”,“任务”。“提醒”来自“任务”,而不是“任务”。“状态”按“任务”排序。截止日期” DESC
当我在 pgAdmin 中将 "task"."status" 更改为 "task"."status" = 'true' 时,一切正常!但我很困惑!首先:为什么我会收到这个错误?其次:如果 status 是一个 BooleanField,为什么当我比较它一个 string('true') 时我没有收到任何错误?
谢谢您的帮助!
视图.py
class TaskListView(ListView):
model = Task
template_name = 'mysite/show_tasks.html'
def get_context_data(self, **kwargs):
context = super(TaskListView, self).get_context_data()
undone_tasks = Task.objects.filter(status=False)
return context
模型.py
class Task(models.Model):
# some other fields...
status = models.BooleanField(verbose_name='Task Status', default=False)
class ReminderNotification(models.Model):
owner = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='user', related_name='owner_notifications')
message = models.TextField(max_length=200, default="", blank=True, null=True, verbose_name='message')
task = models.ForeignKey(Task, on_delete=models.CASCADE, verbose_name='task',
related_name='task_reminder_notifications')
解决方案
这就是我解决这个问题的方法:我在 pgadmin 4 中检查了“状态”的类型,它是字符变化而不是布尔值,所以我使用下面的查询更改了它的类型:
ALTER TABLE task ALTER COLUMN status TYPE BOOLEAN USING status::boolean
推荐阅读
- c++ - 内置 C++ 头文件无法编译时如何解决?
- firefox - 如何从 Firefox 的“页面信息”(CTRL+I) 中抓取?
- python - 来自 VS Code 的使用 subprocess 模块的“conside-using-with”代码质量建议
- mysql - 如何从应用程序级别复制数据?不是数据库级别
- angular - 在客户端使用 Ionic 5 和 Angular,在服务器端使用 Flask,如何加密我的 http URL 参数?
- python - 使用 __str__ 和 __repr__ Python 方法从类方法中打印列表
- regex - 如果尚未添加,请将文本添加到末尾
- c# - 循环内的 Blazor 导航?
- sql - 如何在 SQL 的 WHERE 子句中动态调用列
- perl - 无法通过包定位对象方法
错误