【问题标题】:Django and technical fieldsDjango 和技术领域
【发布时间】:2018-11-15 17:14:52
【问题描述】:

我正在构建一个数据模型。我希望每个模型都有一些技术领域,例如:createdupdated。我不喜欢将这些字段添加到每个模型中(你知道...... DRY)。

我尝试用createdupdated字段构建一个父类,并在其他模型中继承它,但是Django的ORM并没有将createdupdated字段放在模型的表中,相反,它为这两个字段创建另一个表,并通过外键将其链接到模型。那不是我想要的。

有没有可行的办法?

【问题讨论】:

    标签: python django django-orm dry


    【解决方案1】:

    我做了很多次:

    class TimeStampedModel(models.Model):
        """
        An abstract base class model that provides self-
        updating 'created' and 'modified' fields
        """
    
        created = models.DateTimeField(auto_now_add=True)
        modified = models.DateTimeField(auto_now=True)
    
        class Meta:
            abstract = True
    

    对于其他型号:

    from core.models import TimeStampedModel
    
    class MyClass(TimeStampedModel):
        """
        CLASS LAMBDA
        """
        field = models.DecimalField(verbose_name=u"Name", max_digits=7, decimal_places=2)
        field2 = models.CharField(verbose_name=u"Name 2", max_length=200)
    

    现在在ipython

    from bundle.models.my_class import MyClass
    item = MyClass.objects.first()
    print item.created 
    

    现在created 设置为created (auto_now_add=True) 而modified 设置为您....modified 您的条目(auto_now=True)。

    神奇的是,它是一个抽象类 (doc here):

    当您想将一些通用信息放入许多其他模型中时,抽象基类很有用。您编写基类并将 abstract=True 放在 Meta 类中。该模型将不会用于创建任何数据库表。相反,当它用作其他模型的基类时,它的字段将添加到子类的字段中。

    【讨论】:

    • 它适用于多个父级.. 它是一个抽象类
    猜你喜欢
    • 2014-01-23
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2012-06-12
    • 2018-04-20
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多