4

私はDjangoでタグ付けシステムを構築しています.タグ名にスペースやその他の文字を表示できるようにしたいのですが、それらを除外し、名前などを一致させるときに小文字を使用します.

そのために、次のようにタグ モデルにフィールドを追加しました。

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

しかし、私は問題に直面しています.CharFieldは文字列ではなく、私の人生ではそれを文字列に変換する方法を見つけることができません!

4

3 に答える 3

7

そこを定義して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し、単語以外の文字を削除することができます。ただし、DBに保存することはできません。これが必要な場合は、別のものを追加して、同期CharFieldを維持する必要があります。namematchname

于 2009-11-23T11:59:37.363 に答える