Django基础(四)

模型

  1.字段和模型
    1.field Type
      1.BooleanField()
      2.EmailField() 存电子邮件-varchar
      3.ImageField() 存图片路径-varchar
      4.ImageField(upload_to = "static/**/**")
      5.IntergerField()
      6.URLField()
      7.TextField()#存大量文本数据的 -text
      8.DecimalField()
      9.CharField()
   
   2. field option(字段选项)
      1. max_length
          指定数据的最大长度
          在CharField()中必须要设置的选项

      2. default
          为当前字段指定默认值


      3. Null
          指定当前字段是否允许为空, 默认值是 false


   练习:完善FruitDay部分的models
       1. models 商品的类型,商品, 用户
       2.商品类型 GoodsType
            1. 类型名称-title
            2. 类型图片-picture
               默认上传至: static/upload/goodstype
            3. 类型描述-desc


       3.商品 Goods
             1.商品名称:name
             2.商品价格:price(DecimalField)
             3.商品规格:spec
             4.商品图片:picture
                默认上传至:static/upload/goods
             5.销售状态:isActive(默认为True)




      4.用户: User
           1.电话号码:uphone
           2.    密码:upwd
           3. 电子邮件:uemail
           4. 用户名: uname
           5. 用户状态:isActive 默认为True
           6. 


   3.数据的版本转换
      1.python3 manage.py migrate
        执行所有应用中最新版本的数据库中间文件


      2. ./manage.py migrate 应用名称 版本号
        执行应用中,版本号 对应的中间文件


   4.通过数据库自动导出Models
       python3 inspectdb > 文件名.py
       python3 inspectdb > 


3.模型中的CRUD
  1.通过ORM 向 DB 中增加数据
     1. Entry.objects.create(属性=值,属性=值)
        Entry:具体要操作的Model类



      ex:
        1. Author.objects.create(               name="张三丰",age=33)



        2. 创建一个Models对象, 通过对象的save()
            obj = Author(name="laoshe",age=33)
            obj.save()

        3.使用字典来构建对象,通过save()
          完成增加
            dic = {
              "属性1":值1,
              "属性2":值2,
              "属性3":值3,
            }
            obj = Entry(**dic)
            obj.save()
        练习:
          使用三种方式,分别想Publisher,Book 中
          各增加三条数据

  

2.查询操作(重难点) 

      1.通过Entry.objects 调用查询接口
      2.基本查询操作
         语法: all()
         用法: Entry.objects.all()
         返回: QuerySet

      3.查询指定列
         语法 values("列1","列2",..)
         用法: Entry.object.values('列1','列2',....)
         返回: QuerySet

    ex:
         Author.objects.values('name','age')
         等同于 select name,age,from index_Author
           {'names': '朱自清', 'age': 33}
           {'names': '朱自清', 'age': 33}
           {'names': 'laoshe', 'age': 33}
           {'names': '你好', 'age': 33}

         注意:values()可以用在所有的返回查询结果集的方法后面
           Author.objects.all().values("names","age") 

      4. 排序函数
          语法:order_by("列1","列2")
          用法:Entry.objects.order_by("列1",'列2')
              默认的排序规则是升序
              如果需要降序,则在列前添加一个"-"


          ex:
            1.Author.object.order_by("age")
            2.Author.object.all().order_by("-age")

    

  5. 对条件取反

          用法:Entry.objects.exclude(条件)
          ex:   
            1.Author.objects.exclude(id=3)
               select * from author where not(id=3)

            2. Author.objects.exclude(id=3,age=85)
               select * from author where not (id=3 and age=85)

     6. 根据条件查询部分行数据(重难点)
           
       方法:filter(参数)
         用法: Entry.object.filter(参数)
         1.使用Entry中的属性作为查询参数
           多个参数的话, 使用","隔开, 映射到sql语句上
           是使用and来进行关联的
          ex:
           1.Author.objects.filter(id=1)
             select * from  author where id=1  
           2. Author.objects.filter(id=1,name="莫言")
              select * from author where id=1 and name="莫言"


        2.通过Field Lookup(查询表达式)完成复杂条件的构建


           1.查询表达式:每个查询表达式都是一个独立的查询条件
             可以用在所有的有查询条件的位置处


           2.__exact
             作用:精确查询, 等值判断
             用法:Entry.objects.filter(属性__exact=值)
             ex:
               Author.objects.filter(id__exact=1)
               select * from author where id = 1;


             3.__contains
                作用: 筛选出属性中包含指定关键字的记录(模糊查询)
                ex:
                  Author.objects.filter(names_contains = "ao")
                  select * from author where names like "%ao%"
             4.__lt
                作用: 筛选出属性值小于指定值的记录


             5.__lte:
                 作用:筛选出属性值小于等于指定值的记录


             6.__gt
                作用: 筛选出属性值大于指定值的记录


             7.__startswitch
                作用: 筛选出以指定关键字开始的记录


             8.__endswith
                 作用: 筛选出以指定关键字结束的记录


           3.查询只返回一条数据
              语法:get(条件)
              用法:Entry.objects.get(查询条件/表达式)
              注意:
                该函数只用于查询一条数据.
          
           练习;
             http://localhost:8000/03_aulist/
             显示01_aulist.html视图


  3.修改数据
        1.修改单个数据
           1.通过get()得到要修改的实体对象
           2.  通过实体对象的属性修改属性值
           3.  在通过实体对象的save()保存回数据库
           ex:

               au = Author.objects.get(id=1)
              au.name = "laoshe"
              au.age = 45
              au.save()
        2.批量修改数据  
           调用查询结果集的update()完成批量修改
           Entry.objects.all().update(属性=值,属性=值)   
           ex:
              Author.objects.all().update(age=75) 
   
   4.删除数据
        调用实体对象/查询结果集的delete()即可

      1. 删除单个对象

          obj = Author.objects.get(id = 1)
          obj.delete()

      2. 删除多个对象
          Author.objects.all().delete()

     练习:
        完成删除操作
        1.点击删除链接是,删除对应的数据
            http://localhost:8000/04_delete/id
        2.在对应的视图中接收参数,并将对应的author删除


      作业:在查询列表的基础上完成下列操作
          1.点击修改的时候,将该用户的信息显示在05_au_html上
          2.每个数据都用文本框显示


       2.改版删除操作
         1.在Author 实体中增加一个属性,isActive,
         2. 在查询列表中,点击删除时,将要删除的用户isAcive更改为False
         3. 查询所有的数据时候, 只查询isActive为true的用户
            并显示在模板上
  

你可能感兴趣的:(Django基础)