Forced numeric comparison on CharField in djangos orm filter
I have a dynamic data structure in my django model, basically this is one CharField where text and numbers can be stored:
class CSFeature(models.Model):
csfFeatureValue = models.CharField(max_length=200)
my Filter:
cslist = CSFeature.objects.filter(csfFeatureValue__gte=filter_value)
The problem is that string comparison takes place, for example
stored value (csfFeatureValue) = 23
- Filter
- filter_value = 13 returns the model
- filter_value = 3 filter does not return model (string comparison)
How can I force a numeric comparison here? Since this is a generic datamodel, I cannot change the datatype of the model ...
source to share
This seems like bad design templates. We assume that the discriminator rule: "csfFeatureValue" is numeric.
You can override the save method for the correct field to save:
'13'
We will store:
' _total of 198 blank spaces_ 13'
Here he is:
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)
now you can compare:
filter_value = "{0:200}".format( 3 )
cslist = CSFeature.objects.filter(csfFeatureValue__gte=filter_value)
I repeat: double-check the design . This answer is just a technical approach to solving the related problem, but your problem is not with the django query api operation, but with the model design .
source to share