我正在Django中构建一个标记系统,并希望允许显示标记名称中的空格和其他字符,但是在匹配名称等时将其过滤掉并使用小写字母。
为此,我在我的Tag模型中添加了一个字段,如下所示:
class Tag(models.Model):
name = models.CharField(max_length=200, unique=True)
matchname = re.sub("\W+" , "", name.lower())
但是我遇到了一个问题,CharField不是一个字符串,我不能为我的生活找到如何将它转换为一个!
答案 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
并保持name
和matchname
同步。