我有一个包含版本号的模型,由于历史原因,它存储为文本字段,如x.y.z
。
class Product(models.Model):
version = TextField()
我想在数据库上执行请求,以获取所有主要版本号高于5的产品。或者让所有产品的次要版本低于6。
我对SQL能力不太熟悉。我可以用Django查询集表达这样的东西吗?或者如果Django本身不支持它,可能使用纯SQL?
类似的东西:
Product.objects.filter(version__some_expression_gt=5)
这可能吗?
我知道显而易见的解决方案是将version
字段拆分为数字对应字段,但遗憾的是,由于愚蠢的原因,这不是我的选择。
答案 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 )