2011-12-30 4 views
1

私は私が持っている古いシステムからデータベースを "継承"しました。その中には、ブール値でなければならない特定のテーブルの列がありますが、代わりにvarchar(1)で 'N'または '0真であることを表すために 'Y'または '1'を書くことができます(書いているときには1つまたは他の規約を使用してコードのさまざまな部分が表示されますが、Django ORM:データベースのcharカラムにBooleanFieldを関連付けることはできますか?

私はもともとJavaで書かれたシステムをPython + Djangoに移植/書き換えています。古いものをシャットダウンし、ポートが完了したときだけデータベースの混乱を「きれいにする」ことができます。

モデルクラスのフィールドを外部的にブール値として表示したいので、データベースが最終的に修正されたら、コードで行う必要があるのはフィールドをaプレーンBooleanField。それを行う簡単な方法はありますか?

+0

関連の重要なヒントはあなたにも変換することget_prep_value()を実装してはならないhttp://stackoverflow.com/questions/3988171/custom-fields-to-python-not-working-django –

答えて

5

django.db.models.Fieldをサブクラス化し、to_pythonのメソッドを実装することによって、あなたが望むように動作する独自のフィールドクラスを作成できます。

from django.db import models 

class MyField(models.CharField): 

    def to_python(self, value): 
     if value in ('Y', '1'): 
      return True 
     if value in ('N', '0'): 
      return False 
     raise ValueError 

これはあなたにいくつかの洞察力を与えることを願っています:)

+1

でありますboolean値をデータベースに格納するためのcharに戻しますか? – ThatAintWorking

+0

@Ron:はい、DBに書き込むことを忘れました。+1 – mouad

2

私の状況は似ているが、従来のデータは一貫TrueとFalse表現するためにYとNを使用しますが、私はいくつかのフィールドの追加の問題を抱えていますNullを許可する。だから私のカスタムフィールドの種類があります。私は彼らがあなたがこの状況でできることのもう少し完全な例だと思うし、フォームにこれらのフィールドを表示/編集するためにはより良いと思われるBooleanFieldタイプから継承しました。

from django.db import models 

class YNBooleanField(models.BooleanField): 

    def __init__(self, *args, **kwargs): 
     kwargs['max_length'] = 1 
     super(YNBooleanField, self).__init__(*args, **kwargs) 

     def to_python(self, value): 
     if value in ('Y', 'y'): 
      return True 
     elif value in ('N', 'n'): 
      return False 
     else: 
      raise ValueError 

    def get_prep_value(self, value): 
     if value: 
      return 'Y' 
     else: 
      return 'N' 

class NullYNBooleanField(models.NullBooleanField): 

     def __init__(self, *args, **kwargs): 
      kwargs['max_length'] = 1 
      super(NullYNBooleanField, self).__init__(*args, **kwargs) 

     def to_python(self, value): 
      if value is None: 
      return None 
     elif value in ('Y', 'y'): 
      return True 
     elif value in ('N', 'n'): 
      return False 
     else: 
      raise ValueError 

    def get_prep_value(self, value): 
     if value is None: 
      return None 
     elif value: 
      return 'Y' 
     else: 
      return 'N'