对字段的一部分执行Django查询

时间:2014-03-11 09:33:58

标签: python sql django django-queryset

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

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

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

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

类似的东西:

Product.objects.filter(version__some_expression_gt=5)

这可能吗?


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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您可以使用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 )