【发布时间】: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更改为BooleanField?python 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