2017-06-23 4 views
0

は、私は、例外がいくつかのフィールドがPersonで必要とされていることであることで、&種類を正確に同じフィールド名を持つ2つのジャンゴモデル、モデルPersonとモデルPersonTemplateを持っていますPersonTemplate。モデルをこれらのクラスの両方に貼り付けるだけでも簡単ですが、ハードコーディングが多く、1つのモデルを編集して他のモデルを忘れてしまった場合、データが破損する可能性があります。のPythonプログラムで定義する変数、彼らはしていないのに対し、

私が念頭に置いておくべき解決策は、フィールドが必要かどうかにかかわらず、論理型引数をとる関数でdjangoモデルフィールドを定義することです。私は方法がわからない何

def get_fields(is_required=True): 
    first_name = models.CharField(max_length=128, verbose_name=_("First Name"), 
            blank=is_required, null=is_required) 
    last_name = models.CharField(max_length=128, verbose_name=_("Last Name"), 
           blank=is_required, null=is_required) 
    return locals() 

class Person(models.Model):  
    vars = get_fields(True) 

class PersonTemplate(models.Model):  
    vars = get_fields(False) 

のようなものは、モデルのクラス本体にget_fieldsからローカル変数を取得することです。誰も、これらのモデルを実装するための良いアイデアや提案がありますか?

答えて

0

アイデアを達成するには、メタクラスを使用する必要があります。しかし、これはいつものように悪い考えです。 Django抽象モデルと継承を見てみませんか?これはあなたの質問をはるかに読みやすく、簡単な方法で解決します。

1

Djangoには、反復的なフィールドとメソッドを定義し、次に実際のモデルを継承する抽象モデルがあります。

ダイナミック必須フィールドの場合は、モデルメソッドを使用して値を設定し、子モデルのメソッドをオーバーライドできます。 this answerを参照してください。このような

何か作業をする必要があります:

class AbstractPerson(models.Model): 
    @staticmethod 
    def get_first_name_requirement(): 
     return True 

    @staticmethod 
    def get_last_name_requirement(): 
     return True 


    first_name = models.CharField(max_length=128, verbose_name=_("First Name"), 
            blank=get_first_name_required.__func__(), null=get_first_name_required.__func__()) 
    last_name = models.CharField(max_length=128, verbose_name=_("Last Name"), 
           blank=get_last_name_required.__func__(), null=get_last_name_required.__func__()) 
    class Meta(object): 
     abstract = True 

class Person(AbstractPerson):  
    @staticmethod 
    def get_first_name_requirement(): 
     return True 

    @staticmethod 
    def get_last_name_requirement(): 
     return True 


class PersonTemplate(AbstractPerson):  
    @staticmethod 
    def get_first_name_requirement(): 
     return False 

    @staticmethod 
    def get_last_name_requirement(): 
     return False 

私は動的にnull値を割り当てるための、よりエレガントな方法が存在しなければならないと確信しています。しかしこれも仕事を完了させるでしょう。

+1

これはOPが最初に求めていたものですが、is_requiredのフィールド定義属性を動的に変更しながら繰り返しを避ける方法を尋ねています。 – Pythonista

+0

ああ、私の悪い、私は適切に質問を読んでいない、私の答えを更新します。 – v1k45

+1

@Pythonista私は答えを更新しました – v1k45

関連する問題