0

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

选项1

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

选项1

选项 2

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

选项 2

选项 3

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

选项 3

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

4

2 回答 2

4

您的问题表明您希望构建一个抽象类以用作模型继承的基类。这里有一些非常棒的文档。

例如:

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 回答