【问题标题】:Can't filter objects by BooleanField in Django无法通过 Django 中的 BooleanField 过滤对象
【发布时间】:2021-07-02 12:32:46
【问题描述】:

我正在构建提醒并尝试通过名为“状态”的 BooleanField 过滤任务对象。

如您所见,我已将 Task.objects.filter(status=False) 分配给 undo_tasks,但是当我运行它时,我收到此错误:ProgrammingError at /showing-all-tasks/ NOT 的参数必须是布尔类型,而不是字符变化类型 第 1 行:..."status", "task"."reminder" FROM "task" WHERE NOT "task"."st...

这是在 postgres 中运行的查询: 选择“任务”。“id”,“任务”。“user_id”,“任务”。“标题”,“任务”。“slug”,“任务”。“描述”,“任务”。“截止日期”,“任务”。“日期编辑”,“任务”。“状态”,“ 任务”。“提醒”来自“任务”而不是“任务”。“状态”按“任务”排序。“截止日期”DESC

当我在 pgAdmin 中将 "task"."status" 更改为 "task"."status" = 'true' 时,一切正常!但我很困惑!首先:为什么我会收到这个错误?其次:如果 status 是一个 BooleanField,为什么当我比较它一个 string('true') 时我没有收到任何错误?

感谢您的帮助!

views.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

models.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')

【问题讨论】:

  • 在 django shell 中,我手动将状态更改为 booleanfield ,但是当我退出 shell 并再次返回时,状态类型为 !!
  • status 是否可能从 CharField 更改为 BooleanFieldpython manage.py makemigrations --check --dry-run 是否显示任何丢失的迁移?
  • @azundo 不,它是来自乞讨的 BooleanField,当我运行 python manage.py makemigrations --check --dry-run 时,它说没有检测到任何变化
  • 根据您的错误消息,在您的数据库中,task.status 字段的类型为 varchar。对我来说有点神秘,如果你没有迁移,但它总是一个布尔值。
  • @azundo exaclty!我必须在我的数据库中记录,我迭代了这些记录并执行了这个:for t in tasks: t.status = True t.save() 然后我打印 type(t.status) 它是布尔值,但是在我退出 django shell 之后,我又回来了, type(task.status) 是 str !不知道为什么会这样

标签: django postgresql django-models orm pgadmin-4


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2014-01-08
    • 2018-01-15
    相关资源
    最近更新 更多