首页 > 解决方案 > 无法通过 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')

标签: djangopostgresqldjango-modelsormpgadmin-4

解决方案


这就是我解决这个问题的方法:我在 pgadmin 4 中检查了“状态”的类型,它是字符变化而不是布尔值,所以我使用下面的查询更改了它的类型: ALTER TABLE task ALTER COLUMN status TYPE BOOLEAN USING status::boolean


推荐阅读