Django CharField To String

时间:2009-11-23 11:40:16

标签: django django-models tostring

我正在Django中构建一个标记系统,并希望允许显示标记名称中的空格和其他字符,但是在匹配名称等时将其过滤掉并使用小写字母。

为此,我在我的Tag模型中添加了一个字段,如下所示:

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

但是我遇到了一个问题,CharField不是一个字符串,我不能为我的生活找到如何将它转换为一个!

3 个答案:

答案 0 :(得分:7)

您在那里定义了class,因此name不是字符串,而是Django Field

此外,在班级将name转换为matchname没有任何意义。你应该在实例上这样做。

您可以在课程中添加一个方法来执行此操作:

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

答案 1 :(得分:4)

首先,您必须将字段定义为CharField才能将其用于搜索。

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

然后你可以覆盖模型中的save函数来填充它:

class Tag(models.Model):

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

或使用信号做同样的事情:

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)

答案 2 :(得分:2)

您可以添加方法:

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

并使用property装饰者:

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

所有这些都可以让您访问小写的name字段并删除非字字符。但是你不会把它存储在DB中。如果您需要,则需要添加其他CharField并保持namematchname同步。