-
示例
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页面展示定制展示内容,也可用于模板当中
django-model
最新推荐文章于 2024-07-19 16:36:18 发布