【问题标题】:Django CharField To StringDjango CharField 到字符串
【发布时间】:2009-11-23 11:40:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • Argh...无法发布答案而不会出现服务器错误:-(
  • 那就投赞成票吧! ;)

标签: django django-models tostring


【解决方案1】:

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

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

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

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

【讨论】:

  • 类似def matchname(self): return re.sub("\W+" , "", self.name.lower()) 的东西(这是我要在我的答案中提出的,但今天stackoverflow 讨厌我)。
  • @Dominic - 只是在编辑答案以添加它。 我也不断收到服务器错误;该网站不断让我登录和退出,我认为这是问题的根源。
  • 还有一个文档链接! :D
【解决方案2】:

首先,您必须将字段定义为 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)

【讨论】:

  • 就我而言,我必须将*args, **kwargs 作为save() 的参数放在self 之后。无论如何它奏效了。非常感谢这个答案!
【解决方案3】:

你可以添加一个方法:

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 同步。

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2020-11-24
    相关资源
    最近更新 更多