4

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

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

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

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

4

3 回答 3

7

您正在定义 a class,所以name它不是一个字符串,它是一个Django Field

此外,转换namematchname类级别没有任何意义。您应该在实例上执行此操作。

你可以在你的类中添加一个方法来做到这一点:

def get_matchname(self):
    """Returns the match name for a tag"""
    return re.sub("\W+" , "", self.name.lower())
于 2009-11-23T11:57:12.360 回答
4

首先,您必须将字段定义为 CharField 才能使用它进行搜索。

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

然后你可以覆盖模型中的保存函数来填充它,如下所示:

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)
于 2009-11-23T12:03:58.540 回答
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小写的字段并去除非单词字符。但是您不会将其存储在数据库中。如果你想要这个,你需要添加另一个CharField并保持namematchname同步。

于 2009-11-23T11:59:37.363 回答