Django 数据模型 models 与数据模型管理 models_manager

1. models 文件

  • 创建项目需要的类

       #注意:继承的是 models.Model 类
       class User(models.Model):
             name=models.CharFiled(max_length=50)           
    
  • 创建类的属性需要用Model 规定的方法创建
      通过类型创建的对象来封装 管理数据,一定要在这里明确关联和对应关系

    程序 数据库
    class 类型 table 表格
    attr 属性 field 字段
    object 对象 record 记录
  • 有了对应关系之后,我们要创建的模型对象的属性必须和数据库中的字段类型对应起来

    对象中的属性类型定义 表中的字段类型
    AutoField() auto_increment 自动增长
    BooleanField() bool 布尔类型
    NullBooleanField() bool or null 扩展布尔类型
    CharField() varchar 字符串
    TextField() text 长文本
    IntegerField() int 整数
    DecimalField() double 高精度浮点数
    FloatField() float 单进度浮点数
    DateField() date 日期
    TimeField() time 时间
    DateTimeField() datetime 日期时间
    FileField() blob 二进制
    ImageField() blob 二进制
  • 每个字段定义时,都会有自己的一些特殊的选项指定

    选项 描述
    null 如果为 True,将 NULL 空值存储到数据库中,默认 False
    blank 如果为 True,表示该字段允许存储空值,默认 False
    db_column 字段名称,如果不指定,直接使用类型属性的名称作为字段名称
    db_index 如果设置为 True,表示给当前字段添加索引支持
    default 给字段设置默认值
    primary_key 是否设置当前字段为主键
    unique 如果为 True,该字段中存储的值必须是唯一的
  • 在大部分项目中,还会涉及到多表关联操作

    选项 描述
    ForeignKey 一对多关联关系,该字段定义在多的一方
    ManyToManyField 多对多关联关系,该字段两方都需要定义
    OneToOneField 一对一关联关系,该字段可以定义在任意一方
  • 示例及小操作

        #最大长度为10, 保留两位小数.
        sum = models.DecimalField(max_digits=10, decimal_places=2)
         
        #属性关联: Img 类关联 Album   
        album = models.ForeignKey(Album, on_delete=models.CASCADE)
        #  on_delete=models.CASCADE 含义:
        # img是依附album存在,当album不存在(删除),与之关联的img也不存在(删除)
      
        #对象自己的方法:管理器对象没有删除。
        save()   /  delete()
    
  • 可以选择引入Django 对象管理器

    • 选择引入创建对象管理器文件 models_manager
         #首先要在文件里创建对象管理器 UserManager ,然后导入到 models 文件
         from .models_manager import UserManager
        
         #在 class 里添加对象管理器
         class User(models.Model)
              ......
              user_manager=UserManager()
      
    • 不引入创建对象管理器文件 models_manager
         #不引入创建 models_manager 的话,直接使用 models 操作
         user=models.User.objects.filter(**kw).first()
      

2. models_manager 文件

  • 创建 models_manager 文件,创建管理器类

       #注意:继承的是 models.Manager 类
       class UserManager(models.Manager):
    
             #封装管理器的方法,供调用使用
             def all_user(self):
                 return self.all()    
             ......     
    
  • 对象管理器的属性方法:

    方法 作用
    self.create(**kw) 创建一个对象
    self.update(**kw) 更新对象的数据
    self.all() 查询所有对象数据
    self.get(**kw) 查询一个对象
    self.filter(**kw) 查询对象列表

    注意事项:
      查找用户时用 get 只能查一个,查不到会报错,要用 try ... except ;而用 filter查找得到的是一个列表,当只需要一个对象数据时要在后边加first()

  • 查找的小方法

    • order_by
         #当用 filter 查找得到一个列表,当我们需要将数据按一定的规则排序时,
         #用 order_by (对象的属性)
      
         # 按时间顺序排列 order_by('publish'),
         #当用时间倒序排列时只需添加一个' - ',order_by('-publish')。
         slist=models.Say.objects.filter().order_by('publish')
      
    • _set.all
         #当查找一个对象关联的所有对象,得到关联对象的列表,
         #用 _set.all 查找一个人的所有说说
         say=models.User.objects.say_set.all
      

3. 直接用对象进行数据操作:Q F

  • Q----->>>对对象的复杂度查询
    Q对象用法:
      Q对象可以对关键字参数进行 封装,从而更好地应用多个查询.可以组合使用 and,or, not 操作符, 当一个操作符是用于两个Q对象的时候,它产生一个新的Q对象.Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面
  • F----->>>专门取对象中某列值的操作
    F对象的用法:
      F对象允许django在未实际链接数据的情况下具有对数据库字段的值的引用.通常情况下我们在更新数据库时需要先从数据库里将原数据取出后放在内存里,然后编辑某些属性,最后提交。F 可以直接操作修改,不需要繁杂步骤。

补充

  • 在命令行使用对象操作数据
        #进入项目文件夹下,导入 userinfo 文件夹里 models 文件定义好的 User
        from userinfo.models import User
        #使用对象管理器,user_manager 是User 里引入的 UserManager 
        u=User.user_manager
        #create_user 是 UserManager 里封装的创建对象方法
        u.create_user(name='ws')
        ......
    
  • 更新数据
        #获取用户更改属性,并修改到数据库: 
        # 1.先确定数据在数据库的位子:
        user = user_manager.get(id=u_id)
    
        # 2.获取更新后的属性
        name = request.POST['name']
    
        # 3. 更新数据
        user.name=name
    
        # 4.更新数据到数据库  
        user.save()
    
  • 获取三级类型的列表
        #查找一个不存在的对象,获取一个空的符合格式的列表 ,储存数据。
        #得出一个空的 queryset 类型
        g_list = goods_manager.find_condition(gname='1')
    
        #for循环二级类型列表,获取三级类型列表,三级类型列表累加。
        for type in type_list:
            goods_list = goods_manager.find_condition(gtype=type)
            g_list = goods_list | g_list
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容