Django 布尔查询集过滤不工作

18 投票
3 回答
37675 浏览
提问于 2025-04-16 22:50

这让我困扰了快一个小时了。

我有一个这样的模型:

sold= models.BooleanField(default=False)

还有以下的视图代码:

properties = Property.objects.filter(sold=False).order_by('-created_on');

以及我在sqlite3数据库中的以下值:

 sqlite> select sold from clients_property;
1
1
1
1
1

还有以下的模板代码是可以正常工作的(也就是说,它能隐藏已售出的商品):

{% if not property.sold %}

有人知道为什么查询集过滤器不工作,或者我哪里做错了吗?我试过:

sold="1"
sold=1
sold="false"
sold=False
sold="False"

3 个回答

2

我也遇到过同样的问题。我的解决办法是把那一列的类型从'bit'改成'tinyint'。

在我的情况中,问题是因为我手动在一个表里添加了一列。

23

我也遇到过这个问题。

结果发现,在SQLite中,布尔值可以是0,也可以是False。

所以Django对设置为False的布尔值不太兼容。

我在SQLiteMan中看到了这个不一致的地方。

简单的更新就解决了这个问题。

我觉得这个问题是在我开发环境中进行架构升级和迁移时出现的,所以我并不太担心。

17

根据你发布的内容,一切都正常运作。如果你在命令行里试试这些东西,你应该能得到以下结果。当然,我有些内容是自己编的,所以在直接复制粘贴之前,最好先看看。

>>> from myapp.models import Property
>>> Property.objects.all()
[<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,]
>>> Property.objects.filter(sold=False)
[]
>>> Property.objects.filter(sold=True)
[<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,<Property: Property object>,]
>>> Property.objects.create(sold=False, my='other', fields=1)
>>> Property.objects.filter(sold=False)
[<Property: Property object>,]

杰克说得对,在大多数SQL的实现中,1应该被认为是真(True)。

撰写回答