select * from tb where id > 1    # 对应关系
    models.tb.objects.filter(1id__gt=)    
    models.tb.objects.filter(id=1)
    models.tb.objects.filter(id__lt=1)
 
创建类
    a.先写类
    from django.db import models
 
    # 生成的表名 app01_userinfo
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
        b. 注册APP
    settings.py
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',    
        ☆☆☆☆-> 'app01',    
    ]
 
    如果不想使用sqlite数据库,也可以到settings里配置成mysql数据库
    DATABASES = {
        'default:'{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'dbname',
        'USER':'root',
        'PASSWORD':'xxxx',    
        'HOST':'',
        'PORT':'',    
            }
    }
    c. 执行命令
 
    python manage.py makemigrations
    python manage.py migrate
 
    d. ********** 注意 ***********
 
    Django默认使用MySQLdb模块链接MySQL    (python3,现在没有支持mysqldb)
    主动修改为pymysql,在project同名文件夹下的__init__文件中添加如下代码即可:
 
        import pymysql
        pymysql.install_as_MySQLdb()
 
 
    1. 根据类自动创建数据库表
    如果创建或更改表结构时,一直失败,可以尝试删除makemigrations下的文件
    # app下的models.py
    python manage.py makemigrations
    python manage.py migrate  
  
    字段:
        字符串类型                                   CharField
        数字                                            IntegerField,BigIntegerField
        时间                                            DateTimeField
        二进制                                         BinaryField
        自增(primary_key=True)           AutoField
          Date Char Url 都是字符串,为什么要区分是因为要给Django admin管理使用
参数解析
字段的参数 作用
null db是否可以为空
default 默认值
primary_key 主键
db_column 列名
db_index 是否建立索引
unique 唯一索引
on_delete 级联操作:models.CASCADE级联删除,PROTECT抛出ProtectedError,models.SET_NULL置空模式,models.SET_DEFAULT置默认值,SET(): 自定义一个值
unique_for_date 2006:11:11 11:11:11 只对时间索引
unique_for_month 2006:(11):11 11:11:11 只对月份索引
unique_for_year 2006:11:11 11:11:11 只对年份索引
auto_now 创建时,自动生成时间 执行obj.save()时才更新
auto_now_add 更新时,自动更新为当前时间
choices django admin中显示下拉框,避免连表查询
blank django admin是否可以为空
verbose_name django admin显示字段中文(verbose_name替换为其值显示)
editable django admin是否可以被编辑
error_messages 错误信息
help_text django admin输入框下面的小提示
validators django form ,自定义错误信息
 
    # obj = UserGroup.objects.filter(id=1).update(caption='CEO')←←
    # obj = UserGroup.objects.filter(id=1).first()
    # obj.caption = "CEO"
      # obj.save()
       
     创建 Django 用户:python manage.py createsuperuser
 
  
    增删查改时,可以使用同一个HTML,在处理时分发不用的views函数       ------->      详细例子day19,views函数模块
    增
    1.models.User.objects.create(name='aaa',age=18)
    2.dic = {'name': 'xx', 'age': 19}
       models.User.objects.create(**dic)
 
 
    3.obj = models.User(name='aaa',age=18)
       obj.save()
    删
    models.User.objects.filter(id=1).delete()
    改
    models.User.objects.filter(id__gt=1).update(name='aaa',age=22)
    dic = {'name': 'xx', 'age': 19}
    models.User.objects.filter(id__gt=1).update(**dic)
    查
    models.User.objects.filter(id=1,name='root')
    models.User.objects.filter(id__gt=1,name='root')                相当于 and 多条件
    models.User.objects.filter(id__lt=1)
    models.User.objects.filter(id__gte=1)
    models.User.objects.filter(id__lte=1)
 
    models.User.objects.filter(id=1,name='root')
    dic = {'name': 'xx', 'age__gt': 19}
    models.User.objects.filter(**dic)
 
 
    v1 = models.Business.objects.all()                                             # QuerySet ,内部元素都是对象    v1.xxx
    v2 = models.Business.objects.all().values('id','caption')            # QuerySet ,内部元素都是字典       v2.xxx
    v3 = models.Business.objects.all().values_list('id','caption')         # QuerySet ,内部元素都是元组     v3.1 v3.2
 
    # 获取到的一个对象,如果不存在就报错
    models.Business.objects.get(id=1)
    结果是对象或者None = models.Business.objects.filter(id=1).first()
    models.tb.object.create(name='root', user_group_id=1)
    d.
        userlist = models.tb.object.all()
        for row in userlist:
        row.id
        row.user_group_id
        row.user_group.caption
 
    默认取出来的是QuerySet列表,可以使用一下方法直接获取QuerySet对象
        model.UserInfo.objects.filter(name='xxx').first()                        如果单条数据不存在时,会直接报错,所以要加try expect
    获取QuerySet对象个数
        model.UserInfo.objects.filter(name='xxx').count()
    
    连表操作会造成性能损失(效率非常低),对于固定的几个类型的外键关联时,可以使用choices将类型放至内存中
            user_type_choices = {
                (1,'超级用户'),
                (2,'普通用户'),
                (3,'其他用户'),
            }
            user_type_id = models.IntegerField(choices=user_type_choices,default=1)        ------->      Django admin 中能直接看到对应值
 
    获取数据库表时,连同关联表一并取出。这样,在使用外键时(list.外键字段.外键关键字,就不用再次查询数据库,减少数据库操作)

    list = models.UserInfo.objects.all().select_related('user_type')
 
    
        
    外键:
                class UserType(models.Model):
                caption = models.CharField(max_length=32)
                id caption
                # 1,普通用户
                # 2,VIP用户
                # 3, 游客
 
                class User(models.Model):
                age = models.IntergerFiled()
                name = models.CharField(max_length=10)#字符长度
                # user_type_id = models.IntergerFiled() # 约束,
                user_type = models.ForeignKey("UserType",to_field='id') # 约束,         ---------->    默认    user_type_id
                使用外键的字段
                    models.User.objects.filter(id=1).first().caption
                    获取到QuerySet对象是 :         QuerySet[obj(id,username,email,user_group_id,user_group_id(uid,caption))]
                    所以print user_group_id 是一个UserGroup对象
 
                name age user_type_id
                # user1 18 3
                # user2 18 2
                # user3 18 2
 
 
                外键巧用
                1.
                        models.User.objects.create(
                                username="...",
                                password='...',
                                ...,
                                user_group = models.UserGroup.objects.filter(id=1).first()
                        )
            ---------------->>>>>>>>>
 
 
                         models.User.objects.create(
                                    ...,
                                    user_group_id = 1
                        )
                
                    2.在查表的时候,如果对象中有外键,那么外键就会当成对象被封装在QeurySet对象中,那么可以使用
                        obj.forginkey_obj
                   如果外键对象中还有外键,那么可以使用多次点,跨表查询
                        obj.forginkey_obj.forginkey_obj.forginkey_obj.forginkey_obj......
                3.在查询时,只查询特定的某些项,可以用"_"获取关联的表字段
                        models.User.objects.all().values('nid','hostname','b_id','b__caption')            
                        caption为外键关联表中的字段
                              首先这条语句获取的还是QuerySet的对象,对象中是列表,列表中的每一项才是字典
                              HTML 渲染时 这中语句获取的对象只能这样取值     obj.b__caption    ,注意不要和前面的使用点混淆
 
                               models.User.objects.all().values_list('nid','hostname','b_id','b__caption')
                         这种取值和前面一样  obj.1 obj.3 obj.4
 
 

Django学习-7-ORM操作的更多相关文章

  1. Django学习之ORM操作

    一.一般操作 二.必知必会13条 返回QuerySet对象的方法有 特殊的QuerySet 返回具体对象的 返回布尔值的方法有 返回数字的方法 三.单表查询之神奇的双下划线 四.ForeignKey操 ...

  2. Django 学习 之ORM聚合查询分组查询与F查询与Q查询

    一.聚合查询和分组查询 1.聚合查询aggregate 关于数据表的数据请见上一篇:Django 学习 之ORM多表操作(点我) aggregate(*args, **kwargs),只对一个组进行聚 ...

  3. Python/Django(CBV/FBV/ORM操作)

    Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...

  4. Django - 表与ORM操作

    Django - 表与ORM操作 一. 模板语言 模板中也有自己的语言, 该语言可以实现数据展示 - {{ 变量 }} - 循环 {% for i in all_publisher %} {{ for ...

  5. Django学习手册 - ORM 数据创建/表操作 汇总

    ORM 查询的数据类型: QuerySet与惰性机制(可以看作是一个列表) 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它 ...

  6. 初学Django基础02 ORM操作

    django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...

  7. Django 模型层 ORM 操作

    运行环境 1. Django:2.1.3 version 2. PyMysql: 0.9.3 version 3. pip :19.0.3 version 4. python : 3.7 versio ...

  8. Django专题之ORM操作2

    Django ORM操作   目录 一般操作 看专业的官网文档,做专业的程序员! 回到顶部 必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs ...

  9. Django 学习 之ORM多表操作

    一.创建模型 1.模型关系整理 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建 ...

  10. Django 学习 之ORM简介与单表操作

    一.ORM简介 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM). 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到 ...

随机推荐

  1. 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zj ...

  2. BZOJ 1226: [SDOI2009]学校食堂Dining [DP 状压]

    题意: $n$个人排队打饭,第$i$个人口味$a_i$,能容忍最多身后第$b_i$个人先打饭. 先后两人$i,j$做饭时间为$a_i & a_j - a_i | a_j$ 求最少时间 一开始想 ...

  3. BZOJ 2244: [SDOI2011]拦截导弹 [CDQ分治 树状数组]

    传送门 题意:三维最长不上升子序列以及每个元素出现在最长不上升子序列的概率 $1A$了好开心 首先需要从左右各求一遍,长度就是$F[0][i]+F[1][i]-1$,次数就是$G[0][i]*G[1] ...

  4. python中常见的三种句型if,while,for

    1.if语句: 特别说明:条件后面的冒号不能少,同样必须是英文字符. 特别特别说明:if内部的语句需要有一个统一的缩进,一般用4个空格.python用这种方法替代了其他很多编程语言中的{}. num= ...

  5. python重新利用shodan API

    前言: 之前写过一个shodan的API调用 感觉写的不这么好.然后现在重新写一个 shodan介绍: shodan是互联网上最可怕的搜索引擎. CNNMoney的一篇文章写道,虽然目前人们都认为谷歌 ...

  6. python 路飞模块一考核总结

    1. 分别解释"=","==","+="的含义(口述) =为赋值语句,把一个变量值赋予另一个值 == 为条件判断,判断两个值是否相等 += ...

  7. 零基础2018如何系统地学习python?

    首先告诉你的是,零基础学习开始系统学习Python肯定难,Python的专业程度本身就不简单,学习这事本来就是一件非常煎熬的事情,人都不愿意学习,可是没办法,为了生存掌握一个技能,你必须学,如果你认真 ...

  8. Apache、Lighttpd、Nginx 三种web服务器对比

    简介 1.    Apache Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.Apac ...

  9. java中public private protected default的区别

    1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直 ...

  10. 机器学习之Adaboost (自适应增强)算法

    注:本篇博文是根据其他优秀博文编写的,我只是对其改变了知识的排序,另外代码是<机器学习实战>中的.转载请标明出处及参考资料. 1 Adaboost 算法实现过程 1.1 什么是 Adabo ...