在Django orm过滤器中强制CharField的数值比较

时间:2014-09-12 09:04:42

标签: python django

我的django模型中有一个动态数据结构,基本上它是一个CharField,可以存储文本和数字:

class CSFeature(models.Model):
    csfFeatureValue = models.CharField(max_length=200)

我的过滤器:

cslist = CSFeature.objects.filter(csfFeatureValue__gte=filter_value)

这里的问题是,进行字符串比较,例如

储值(csfFeatureValue)= 23

  • filter_value = 13过滤器返回模型
  • filter_value = 3过滤器不返回模型(字符串比较)

我如何在这里强制数字比较?由于这是一个通用的数据模型,我无法更改模型的数据类型......

1 个答案:

答案 0 :(得分:0)

这似乎是一个糟糕的模式设计。我们假设鉴别器规则是' fsfFeatureValue'是数字。

您可以将保存方法覆盖到右对齐字段,而不是存储:

'13'

我们将存储:

'  _total of 198 blank spaces_ 13'  

这是:

class CSFeature(models.Model):
    csfFeatureValue = models.CharField(max_length=200)

    def save(self, *args, **kwargs):
        if self.csfFeatureValue.isdigit():
            self.csfFeatureValue = "{0:200}".format(int( self.csfFeatureValue ))
        super(Model, self).save(*args, **kwargs)  

现在你可以比较:

filter_value = "{0:200}".format( 3 )
cslist = CSFeature.objects.filter(csfFeatureValue__gte=filter_value)  

我再说一遍:重新检查你的设计。这个答案只是解决相关问题的技术方法,但你的问题不是django查询api操作,而是模型设计