Django CharField To String

…衆ロ難τιáo~ 提交于 2021-02-07 19:24:29

问题


I'm building a tagging system in Django and would like to allow spaces and other characters in the tag name for display but filter them out and use lower case when matching names etc.

To that end I have added a field to my Tag model as so:

class Tag(models.Model):
    name = models.CharField(max_length=200, unique=True)
    matchname = re.sub("\W+" , "", name.lower())

However I am running into a problem, the CharField is not a string and I cannot for the life of me find out how to convert it to one!


回答1:


You're defining a class there so name is not a string it's a Django Field.

Additionally, converting name to matchname at the class level doesn't make any sense. You should be doing this on the instance.

You could add a method to your class to do this:

def get_matchname(self):
    """Returns the match name for a tag"""
    return re.sub("\W+" , "", self.name.lower())



回答2:


First you have to define the field as as a CharField to be able to use it for search.

class Tag(models.Model):
    name = models.CharField(max_length=200, unique=True)
    matchname = models.CharField(max_length=200, unique=True)

And then you can overwrite the save function in the model to populate it like this:

class Tag(models.Model):

    def save(self):
        self.matchname = re.sub("\W+" , "", self.name.lower())
        super(Tag,self).save()

Or use a signal for doing the same:

from django.db.models.signals import pre_save

def populate_matchname(sender,instance,**kwargs):
    instance.matchname = re.sub("\W+" , "", instance.name.lower())

pre_save(populate_matchname,sender=Tag)



回答3:


You could add a method:

class Tag(models.Model):
    name = models.CharField(max_length=200, unique=True)
    def get_matchname(self):
        return re.sub("\W+" , "", name.lower())

And use property decorator:

class Tag(models.Model):
    name = models.CharField(max_length=200, unique=True)
    @property
    def matchname(self):
        return re.sub("\W+" , "", name.lower())

All this will let you to access name field lowercased and with non-word characters stripped. But you won't get it stored in DB. If you want this you'll need to add another CharField and keep name and matchname synchronized.



来源:https://stackoverflow.com/questions/1782622/django-charfield-to-string

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!