Skip to main content

将管理字段(created_on/by、laste_edited_on/by)添加到现有模型的 Django 抽象模型

项目描述

Django 模型管理字段

Django是当今最流行的 Python Web 框架之一。重要的是,它提供了一个ORM,允许我们将模型定义为 Python 类,Django 为我们映射到数据库表示。

我有一个非常普遍、几乎无处不在的愿望/需要,就是针对所有数据库对象保留一些记录,包括谁创建了它们、何时以及谁最后编辑了它们以及何时。非常基本的跟踪字段。鉴于需求的普遍性,最好将其作为我的模型派生的抽象模型来实现。

模型的基本Django示例:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

可以这样扩展:

from django.db import models
from django_model_admin_fields import AdminModel

class Person(AdminModel):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

它具有将以下字段静默添加到模型中的简单效果:

    created_by = models.ForeignKey(User, verbose_name='Created By', 
                                   related_name='%(class)ss_created', 
                                   editable=False, null=True, on_delete=models.SET_NULL)
    created_on = models.DateTimeField('Time of Creation', editable=False, null=True)
    created_on_tz = TimeZoneField('Time of Creation, Timezone', 
                                  default=settings.TIME_ZONE, editable=False)

    last_edited_by = models.ForeignKey(User, verbose_name='Last Edited By', 
                                       related_name='%(class)ss_last_edited', 
                                       editable=False, null=True, on_delete=models.SET_NULL)
    last_edited_on = models.DateTimeField('Time of Last Edit', editable=False, null=True)
    last_edited_on_tz = TimeZoneField('Time of Last Edit, Timezone', 
                                      default=settings.TIME_ZONE, editable=False)

(当然更准确的描述在__init__.py

重要的是,它还覆盖了 mmodelsave()方法以在调用之前设置这六个字段super().save()(即默认保存方法),因此这些字段是自动管理的。

当前活动的Django 时区也被保存,以支持对已保存时间的合理人类解释(如 Django 的DateTimeField)不知道时区。

为了更容易地使用这两个属性,模型中还添加了两个属性:它们是天真和created_on_local字段的last_edited_on_local时区感知版本。created_onelast_edited_on

为了说明上面 Person 示例的用法:

person = Person()
person.first_name = "John"
person.last_name = "Smith"
person.save

print(f"{person.first_name} {person.last_name}")
print(f"was created by {person.created_by} on {person.created_on_local}.")

当然,要使用当地时间,您需要激活创建用户所在的时区。为此,您需要先了解它。Javascript 库jstz在检测用户时区方面很有用,并且在 django 文档中正确设置 Django 时区有一个很好的指南。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

django_model_admin_fields-0.1.tar.gz (9.4 kB 查看哈希)

已上传 source

内置分布

django_model_admin_fields-0.1-py3-none-any.whl (10.0 kB 查看哈希

已上传 py3