当我需要制作我的过滤器时,我有一个问题:

我需要Django将字符串字段作为整数进行比较(几乎整个表都是整数)

这不起作用,因为只返回9的条目,而不是12或13的条目.

queryset = Cards.objects.extra(select={'stars': 'CAST(stars AS INTEGER)'}).filter(stars__gte= 9)

我也试过这个:

Cards.objects.annotate(stars_integer=Cast('stars', output_field=IntegerField())).filter(stars__gte= 9)

结果相同,我不能将字段更改为"",因为有些值是字符串,如"?"和"X"

class Cards(models.Model):
    # CARD NAME
    name = models.CharField(
        max_length=128,
        null=False,
        unique=True,
    )
    # AMMOUNT OF STARS
    stars = models.CharField(
        max_length=2, null=True, unique=False, default="", verbose_name="Stars"
    )

谢谢

推荐答案

你已经很接近了,但你忘了用stars_integer:

Cards.objects.annotate(
    stars_integer=Cast('stars', output_field=IntegerField())
).filter(stars_integer__gte=9)

如果项目不必出现在SELECT子句中,但只应用于筛选,则可能需要使用.alias(…) [Django-doc]:

Cards.objects.alias(
    stars_integer=Cast('stars', output_field=IntegerField())
).filter(stars_integer__gte=9)

也就是说,如果该字段包含整数数据,您最好首先使用IntegerField,或许还可以添加一个索引.这也将提高搜索时的效率.

Sql相关问答推荐

Group By子句返回太多行

Trino/Presto sq:仅当空值位于组中第一个非空值之后时,才用值替换空值

使用SQL旋转表的列(Snowflake)

如何连接第二个表并将其内容输入到第一个表的单个字段中?

收到%1、%2或%2邮箱的唯一客户

使用多个嵌套数组查询JSON数据

PostgreSQL中递归CTE查询的故障过滤

GRAFANA 数据库查询错误:pq:列名称不存在

SQL根据另一列的顺序和值获取组中的最后一列

SQL 查找 varchar 类型列及其值中多次出现的子字符串

SQL 搜索 - 获取最大值日期的奇怪行为

没有调用子查询的嵌套 JOIN语法是什么?

如何从三个连接表中获取数据,并始终显示第一个表中的数据,以及第三个表中的空值或现有记录?

SQL Server中使用min()和max()从选定的特定值id表中删除不必要的时间

如何在 postgres 中旋转某些数据字段

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

在Snowflake中如何使用SQL对版本字符串进行排序?

插入行时的行安全策略问题

oracle中多行的跨日期范围的交集

包含多行的 SQL 查询