代码之家  ›  专栏  ›  技术社区  ›  nepko

Django将字符串过滤为整数?

  •  1
  • nepko  · 技术社区  · 1 年前

    当我需要制作过滤器时,我遇到了一个问题:

    我需要Django将String字段比较为Integer(几乎整个表都是Integer)

    这不起作用,因为只返回带有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)
    

    同样的结果是,我不能将字段更改为Integer,因为有些值是字符串,如“?”和“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"
        )
    

    谢谢

    1 回复  |  直到 1 年前
        1
  •  0
  •   willeM_ Van Onsem    1 年前

    你离得很近,但你忘了使用 stars_integer :

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

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

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

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