【问题标题】:Perform a Django query on a part of a field对字段的一部分执行 Django 查询
【发布时间】:2014-04-14 19:43:18
【问题描述】:

我有一个模型,它包含一个版本号,由于历史原因,它被存储为一个文本字段,比如x.y.z

class Product(models.Model):
    version = TextField()

我想在数据库上执行请求说,获取所有主要版本号高于 5 的产品。或者获取所有次要版本号低于 6 的产品。

我对 SQL 能力不太熟悉。我可以用 Django 查询集表达这样的事情吗?或者如果 Django 本身不支持它,可能使用纯 SQL?

类似:

Product.objects.filter(version__some_expression_gt=5)

这可能吗?


我知道显而易见的解决方案是将 version 字段拆分为对应的数字字段,但遗憾的是,由于愚蠢的原因,这不是我的选择。

【问题讨论】:

    标签: python sql django django-queryset


    【解决方案1】:

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#regex

    Product.objects.filter(version__regex=r'^[5-9]\.')
    

    只是一个“一半”的解决方案,但我想使用正则表达式是一个好的开始。

    【讨论】:

      【解决方案2】:

      你可以使用Q for complex queries:

      from django.db.models import Q
      
      q_gt5 = Q( version__some_expression_gte="5" )
      q_lt6 = Q( version__some_expression_lte="6" )
      
      results_or    = Product.objects.filter(q_gt5 | q_lt6 )
      results_and   = Product.objects.filter(q_gt5 & q_lt6 )
      results_other = Product.objects.filter( ~q_gt5 & q_lt6 )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        相关资源
        最近更新 更多