0

Django モデルのすべてのクラスに標準フィールドを実装する最適な方法は何ですか?

オプション1

オプション 1 は、親クラスに標準フィールドを作成し、すべてのクラスにそのクラスを継承させることです。例えば:

オプション1

オプション 2

オプション 2 は、他のクラスとの複合関係を持つ標準フィールドを持つクラスを作成することです。例えば:

オプション 2

オプション 3

オプション 3 は、それらを使用したい各クラスでこれらのフィールドを単純に複製することです (これは Django の DRY 原則に違反しています)。例えば:

オプション 3

メモ フィールドと、作成日時と最終更新日時 (および将来的にはユーザー ID) に最適なのはどれですか? これらのフィールドを監査目的で使用したいのは明らかです。つまり、何らかの方法で Django Admin に表示されます。どのアプローチが最適かを判断する際は、このことを念頭に置いてください。

4

2 に答える 2

4

あなたの質問は、モデルが継承する基本クラスとして使用する抽象クラスを構築することを示唆しています。hereには、非常に優れたドキュメントがいくつかあります。

例えば:

class CommonInfo(models.Model):
    notes = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(blank=True, default=datetime.datetime.now)
    last_modified_at = models.DateTimeField(blank=True, default=datetime.datetime.now)

    class Meta:
        abstract = True # This line is what makes the class an abstract class

    def we_all_do_this(self):
        pass

    def we_all_do_this_too(self):
        pass

class ChildA(CommonInfo):   # Note that ChildA class inherits from the CommonInfo abstract base class 
    name = models.CharField(blank=True, null=True, max_length=100)
    state = models.CharField(blank=True, null=True, max_length=100)

    def only_i_do_this(self):
        pass


class ChildB(CommonInfo):   # Note that ChildB class inherits from the CommonInfo abstract base class
    title = models.CharField(blank=True, null=True, max_length=100)
    date = models.DateField(default=datetime.datetime.today)

    def only_i_do_this(self):
        pass
于 2013-05-12T05:28:46.303 に答える
1

この質問に対する正しい答えはないと思いますが、プロジェクト内のすべてのモデルに実装することが必須のフィールドである場合は、親クラスのアプローチを使用します。

つまり、オプション 1 です。

于 2013-05-12T05:12:25.227 に答える