所有Django模型类中的标准字段

时间:2013-05-12 05:09:02

标签: django design-patterns django-models

实现标准字段的最佳方法是什么,我希望Django模型中的所有类都有?

选项1

选项1是在父类中创建标准字段,然后让每个类继承该类。例如:

option 1

选项2

选项2是创建一个具有与其他类具有复合关系的标准字段的类。例如:

option 2

选项3

选项3只是在每个希望使用它们的类中复制这些字段(这违反了Django的DRY原则)。例如:

option 3

对于备注字段以及创建的和上次修改的日期时间(以及将来的用户ID),哪个是最佳的?我显然希望将这些字段用于审计目的,这意味着它们将以某种方式显示在Django Admin中。在帮助我确定哪种方法最佳时,请记住这一点。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我认为这个问题没有正确的答案,但如果它是我希望在项目中所有模型中实现的必修字段,我会采用父类方法。

即你的选择1。