django-model

  • 示例

    class App(django.db.models.Model):
        class Meta:
            unique_together = ["biz_link", "app_name"]
            db_table = "changecare_arch_apps"
            verbose_name = "App"
            verbose_name_plural = "Apps"
    
        biz_link = django.db.models.CharField(max_length=255, verbose_name="业务链路", db_column='biz_link')
        app_name = django.db.models.CharField(max_length=255, verbose_name="应用名", db_column='app_name', blank=False)
        app_type = django.db.models.CharField(max_length=255, verbose_name="应用类型", db_column='app_type')
        content = django.db.models.CharField(max_length=1024, verbose_name=" 备注", db_column='content')
    
    
    class Edge(django.db.models.Model):
        class Meta:
            unique_together = ["app", "capp"]
            db_table = "changecare_arch_edges"
            verbose_name = "节点"
            verbose_name_plural = "节点"
    
        app = django.db.models.ForeignKey(to=App, on_delete=django.db.models.CASCADE, db_column='app_id')
        capp = django.db.models.ForeignKey(to=App, on_delete=django.db.models.CASCADE, db_column='capp_id', related_name='capp_set')
    
    
    
  • Meta属性

    • verbose_name:app显示的名字
    • verbose_name_plural:导航页显示的名字
    • db_table:指定数据表名,不指定会已{app}_{model}的名字为当前表
    • ordering:数组形式,-表示降序,?表示随机,指返回查询结果排序方式,但admin只使用第一个字段
    • unique_together:数组形式,唯一键,需要两个字段保持唯一时使用,会在admin层做出限制,但在平常使用save()方法时,若是数据库层没有定义唯一索引,对象可以保存成功
    • 注:ordering还有一个坑,django中查询时若使用group by时,例子为.values_list({param}).annotate(sum({param2}),这时候需要group by的是param,但是若在model层定义了ordering使用这个语句,那默认会议param,ordering 的param进行group by
  • 外键

    • 类:ForeignKey

    • on_delete=django.db.models.CASCADE 表示删除外键对应的记录后,同时删除本表对应使用的记录,related_name表示反向查询时候用到的名字

      inst_app = APP.objects.get(id=1)
      capp_set = inst_app.capp_set.all.order_by('-id')  # capp_set实际是一个queryset
      
    • 跨数据库使用外键时需要定义router来管理多个数据库,其中主要是allow_relation()方法

  • 另一示例

    class NotifyRobot(models.Model):
        class Meta:
            db_table = "changecare_notifyrobot"
            verbose_name = "群机器人"
            verbose_name_plural = "群机器人"
    
        name = models.CharField(max_length=255, verbose_name="群名", blank=False)
        url = models.CharField(max_length=255, verbose_name="推送链接", blank=False)
    
        def __str__(self):
            return self.name
    
    
    def _user_directory_path(instance: models.Model, filename: str) -> str:
        ext = filename.split('.')[-1]
        filename = '{}.{}'.format(
            uuid.uuid4().hex[:8],
            ext
        )
        return '{}/{}/{}'.format(instance.id, 'files', filename)
    
    
    class Plan(models.Model):
        def save(self, *args, **kwargs):
            update_time = datetime.datetime.strptime(str(self.update_time), "%Y-%m-%d %H:%M:%S")
            create_time = datetime.datetime.strptime(str(self.create_time), "%Y-%m-%d %H:%M:%S")
            self.duration = (update_time - create_time).total_seconds()
            super().save(*args, **kwargs)
    
        title = models.CharField(max_length=255, default="", verbose_name="标题",)
        desc = models.TextField(max_length=500, default="", verbose_name="方案",)
        create_time = models.DateTimeField(verbose_name="开始时间",)
        update_time = models.DateTimeField(verbose_name="结束时间",)
        duration = models.IntegerField(default=0, verbose_name="持续时间(s)", help_text="将根据更新时间和创建时间后台计算",)
        notify_robot = models.ManyToManyField(NotifyRobot, through='PlanRobot', verbose_name='通知群')
        file = models.FileField(db_column='file_path', verbose_name='上传文件', upload_to=_user_directory_path, blank=True)
    
        def chg_desc_short(self):
            if len(self.chg_desc) > 15:
                return django.utils.html.format_html(
                    '''<a title="{chg_desc}">{chg_desc_s}</a>'''.format(
                        chg_desc=self.chg_desc,
                        chg_desc_s=self.chg_desc[:15] + '...'
                    )
                )
            else:
                return self.chg_desc
        chg_desc_short.admin_order_field = 'chg_desc'
        chg_desc_short.short_description = '变更说明'
    
    
    class PlanRobot(models.Model):
        class Meta:
            db_table = "changecare_plan_robot"
    
        plan = models.ForeignKey(Plan, on_delete=models.CASCADE, db_column='pid')
        robot = models.ForeignKey(NotifyRobot, on_delete=models.CASCADE, db_column='rid')
    
    
  • save

    • save()函数是一个对象保存到数据库的操作,可以定制,在继承的父类save函数前做自定义操作
    • 若无super().save(*args, **kwargs)语句且无自己实现保存到数据库的代码,则不会保存到数据库
  • 文件

    • 类:FileField
    • upload_to:表示上传的路径,最好有个随机值
  • 多对多关系

    • 类:ManyToManyField
    • NotifyRobot表示外键连接的类,through指向保存多对多关系的表,可自定义也可不自定义,不自定义会自动生成,保存的也是对应主键
  • 函数

    • 在admin页面展示非所属参数值时可使用函数
    • admin_order_field表示按哪个变量进行排序
    • short_description:简介,也是admin页面该列名称
  • django.utils.html.format_html可生成html代码,故而可以在admin页面展示定制展示内容,也可用于模板当中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值