运维咖啡吧

享受技术带来的乐趣,体验生活给予的感动

sadmin model

保留字段

model有几个保留字段,分别是:create_timeupdate_timecreate_userupdate_userprojectis_deleted为保留字段

create_time: 创建时间,会自动获取数据创建时的时间并填充

update_time: 更新时间,会自动获取数据更新时的时间并填充

create_user: 创建用户,新建数据时会自动获取提交数据的用户填充

update_user: 更新用户,更新数据时会自动获取更新数据的用户填充

project: 所属项目,当project存在时,默认会按照项目进行数据检索与处理

is_deleted: 逻辑删除,判断这条数据是否被删除,如果model中有is_deleted字段存在,则在QuerySet获取数据时会自动过滤掉已删除的数据,也就是.filter(is_deleted=False)

Template为例

class Template(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    create_user = models.ForeignKey(User, on_delete=models.DO_NOTHING, db_constraint=False, verbose_name='创建用户')
    project = models.ForeignKey(Project, on_delete=models.PROTECT, db_constraint=False, verbose_name='所属项目')

    name = models.CharField(max_length=128, unique=True, verbose_name='名称')
    description = models.TextField(null=True, verbose_name='描述')

    is_deleted = models.BooleanField(default=False, verbose_name='已删除')

    def __str__(self):
        return self.name

其中:create_timeupdate_timecreate_userprojectis_deleted为保留字段,在数据的增删改查中无需过多关注,系统会自动处理

保留函数

model中有一个保留函数:to_dict,将model转成字典,当model中有to_dict函数存在时,在QuerySet取数据时默认会按照to_dict定义好的格式生成最终的json数据,否则的话会按照model字段自动生成

TempTask为例

class TempTask(models.Model):
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')

    template = models.ForeignKey(Template, on_delete=models.PROTECT, db_constraint=False)
    subtask = models.ForeignKey(SubTask, on_delete=models.PROTECT, db_constraint=False)

    sortnum = models.SmallIntegerField(default=37, verbose_name='排序ID')
    exechost = models.CharField(max_length=64, default='localhost', verbose_name='执行主机')
    execuser = models.ForeignKey(ExecUser, null=True, on_delete=models.PROTECT, db_constraint=False)

    def to_dict(self):
        return {
            'id': self.id,
            'template': self.template.name,
            'template_id': self.template.id,
            'subtask': self.subtask.name,
            'subtask_id': self.subtask.id,
            'subtask_rcmd': self.subtask.rcmd,
            'subtask_args': self.subtask.args if self.subtask.args else '',
            'sortnum': self.sortnum,
            'exechost': self.exechost,
            'execuser': self.execuser.name if self.execuser else ''
        }

最终返回的数据中将会额外包含template_id,subtask_id,subtask_rcmd,subtask_args四个TempTask原本并不包含的字段