当我需要制作过滤器时遇到问题:
我需要 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)
如果该项目不必出现在 .alias(…)
子句中,但仅应用于过滤,则您可能需要使用
SELECT
[Django-doc]:
Cards.objects.alias(
stars_integer=Cast('stars', output_field=IntegerField())
).filter(stars_integer__gte=9)
话虽如此,如果字段包含整数数据,您最好首先使用
IntegerField
,也许还可以添加索引。这也将提高搜索时的效率。