2016-03-31 8 views
6

デフォルトのチャーフィールドを小文字に設定するにはどうすればよいですか? これは私のモデルである:Djangoモデル - デフォルトのチャーフィールドを小文字に設定

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=64) 
    name = models.CharField(max_length=200) 
    phone = models.CharField(max_length=20) 
    email = models.CharField(max_length=200) 

    def __init__(self, *args, **kwargs): 
     self.username = self.username.lower() 

は私が__init__を試してみましたが、それは動作しません。新しいレコードが保存されるたびに、ユーザー名を小文字にしたいと思います。ありがとう。

+0

あなたが試すことがあり、この http://stackoverflow.com/questions/2350681/django-lowercasecharfield – onerciller

答えて

9

保存方法でそのまま実行します。すなわち、saveメソッドをModelクラスより優先させます。

def save(self, *args, **kwargs): 
    self.username = self.username.lower() 
    return super(User, self).save(*args, **kwargs) 
+3

それはときにモデルこれが唯一の助けを指摘することは重要です更新が保存されます。クエリーセットに.update()を実行するコードを書くと、saveを実行しないので、データベースフィールドに大文字で終わる可能性があります。 – aggieNick02

+0

@ aggieNick02この場合、pre_save信号が役立ちます。 –

+1

いいえ、そうではありません。この回答に対する最近の編集は、正しくないので元に戻す必要があります。 django docs: "update()メソッドは直接SQL文に変換されることに注意してください。直接更新のための一括操作です。モデル上でsave()メソッドを実行したり、pre_saveまたはpost_save signals "(ソース:https://docs.djangoproject.com/ja/dev/topics/db/queries/#updating-multiple-objects-at-once) – aggieNick02

0

save()メソッドを上書きすることは有効な解決方法です。 get_prep_value()メソッドを上書きしてModelレベルではなく、Fieldレベルでこれを処理すると便利であることがわかりました。

この方法で、このフィールドを別のモデルで再利用したい場合は、同じ一貫性のある戦略を採用することができます。また、ロジックはsaveメソッドから分離されています。異なる方法で上書きすることもできます。あなたはこのしまう。このケースでは

class NameField(models.CharField): 
    def __init__(*args, **kwargs): 
     super(SnpField, self).__init__(*args, **kwargs) 

    def get_prep_value(self, value): 
     return str(value).lower() 

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    password = models.CharField(max_length=64) 
    name = NameField(max_length=200) 
    phone = models.CharField(max_length=20) 
    email = models.CharField(max_length=200) 
関連する問題