Django9

上节回顾:

  1  CBV,FBV

  2  数据库操作

    class UserType(models.Model):
    title = models.CharField(max_length=32)


    class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    #在数据库里字段是ut_id
    ut = models.ForeignKey("UserType")

      

      -跨表  (都是前面的表,先取到,相当于#select * from userinfo left join usertype)

        -正向

        1. q = UserInfo.objects.all().first()  

            q.ug.title  在取的时候跨表  内部元素是对象

        2.UserInfo.objects.values("nid","ug_id","ug__title")  在查的时候跨表 。内部元素字典

          #select * from userinfo left join usertype

        3.UserInfro.objects.values_list()  内部元素是元祖

 

       -反向  对象:小写的表名_set

        1.obj = UserGroup.objects.all().first()

          result = obj.userinfo_set.all()  [userinfo对象,userinfo对象]

        2.  小写的表名称

          v = UserType.objects.values("id","title")

           v = UserType.objects.values("id","title","小写的表名称")

            v = UserType.objects.values("id","title","小写的表名称__age")

       3.小写的表名

          

          v = UserType.objects.values_list("id","title")

           v = UserType.objects.values("id","title","小写的表名称")

            v = UserType.objects.values("id","title","小写的表名称__age")

    

    跨表操作,PS:前面的表所有数据都会显示

    其他:

        Userinfo.objects.all()

        Userinfo.objects.filter(id=1,name='cas')

        Userinfo.objects.all().count()

        Userinfo.objects.all().first()

        Userinfo.objects.all().update()

        Userinfo.objects.all().delete()

        Userinfo.objects.all()[1:19]

    跨表:

      正向:

      xxx.filter(ut__title="超级用户").values("id","name","ut__title")

      反向:

      xxx.filter(表名称__title="超级用户").values("id","name","表名称__title")

  3.  分页组件

      -内置

      -自定义

ORM难点:

  1.正反跨表

  2.其他

  3.性能

今日内容:

  1.Django   ORM(model)操作

    1.-增删改查

    -其他

    2.  排序

      user_list = models.UserInfo.objects.all().order_by("-id",'name')  排序 -id是降序

    

    3.分组  

    from django.db.models import Count,Sum,Max,Min,avg  这是聚合函数
    v = models.UserInfo.objects.values("ut_id").annotate(xxxx=Count('id'))  根据ut_id分组,分完组后计算个数。
    print(v.query)  queryset对象有query属性,可以查看他的sql生成语句

    

    分组后二次筛选:

     v = models.UserInfo.objects.values("ut_id").annotate(xxxx=Count('id')).filter(xxxx__gt=1)  filter在后面,相当于having

      v = models.UserInfo.objects.filter(id__gt=2).values("ut_id").annotate(xxxx=Count('id')).filter(xxxx__gt=1)  filter在前面,相当于where

 filter等字段,不仅可以填写这样的filter(id__gt=1),

还可以传入字典形式  condition = {"id":1,"name":"root",}     filter(**condition)

4.基本操作   

models.UserInfo.objects.filter(id__gte=1) #大于等于

models.UserInfo.objects.filter(id__lte=1)  小于等于
models.UserInfo.objects.filter(id__in=[1,2,3])
models.UserInfo.objects.filter(id__in=[1,2,3])
models.UserInfo.objects.filter(id__range=[1,2,3])
models.UserInfo.objects.filter(name__startwith='xxxx')
models.UserInfo.objects.filter(name__endwith="xxx")
models.UserInfo.objects.filter(name__contains="xxx")
#不等于 除id=1以外
models.UserInfo.objects.exclude(id=1)

 

#F,Q,extra

5.F:在跟新时,取到原来的值。

from django.db.models import F
models.UserInfo.objects.all().update(age=F("age")+1)

 

6.Q:用于构造复杂的查询条件

一个Q对象,就是个条件。

一种写法,以对象的方式

models.UserInfo.objects.filter(Q(id__gt=1) | Q(id=2))  or连接

models.UserInfo.objects.filter(Q(id=1) & Q(id=2))  and连接

 

另一种写法,以方法的方式。(做条件筛选的时候,多层)

    # 方式二:
    # con = Q()
    # q1 = Q()
    # q1.connector = 'OR'
    # q1.children.append(('id'__gt, 1))
    # q1.children.append(('id', 10))
    # q1.children.append(('id', 9))
    # q2 = Q()
    # q2.connector = 'OR'
    # q2.children.append(('c1', 1))
    # q2.children.append(('c1', 10))
    # q2.children.append(('c1', 9))
    # con.add(q1, 'AND')
    # con.add(q2, 'AND')
    #
    # models.Tb1.objects.filter(con)

7.extra  额外查询条件以及相关的表,排序
  SQL语句:select name,title,(select count(1) form tb)as n from xb  一个查询结果当做字段
  
 extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
參數怎麼用:
  a.映射
  select
  select_params
  相当于SQL语句:select 此處  from 表
  
  b。条件
  where
  params
  select * from 表 where 此处

  c。表
  tables
  select * from 表,此处

  d。排序
  order_by
  select * from 表 order_by 此处
他们可以综合使用,不冲突
  modles.UserInfo.objects.extra(
    select={'newid':'select count(1) from app01_usertype where id > %s'},
    select_params=[1,],
    where = ['age>%s'],
    params=[18,],
    order_by=['-age'],
    tables=['app01_usertype']

)

  相当于:
  select
      app01_userinfo.id,
      (select count(1) from app01_usertype where id>1) as newid,
  from app01_userinfo,app01_usertype
  where
    app01_userinfo.age > 18
  order by  
    app01_userinfo.age desc


8.#原生SQL语句

# from django.db import connection, connections
    # cursor = connection.cursor()   这就是连接默认的数据库,在seeting里面,database那里,名字为default那个数据库。          

          # cursor = connections['db2'].cursor()这是链接其他数据库。 # cursor.execute("""SELECT * from auth_user where id = %s""", [1]) # row = cursor.fetchone()  fetchall()

9.简单的操作
      all(self)所有元素是对象
      filter(self,*args,**kwargs)  条件查询,条件可以是:参数,字典,Q
      exclude(self,*args,**kwargs)  条件查询,条件可以是:参数,字典,Q
      annotate(self,*args,**kwargs)  实现group by聚合
      distinct
      only('id','name')  返回的queryset内部还是obj,但是字段拿得少,不是all()  
      defer("name")   跟only反着的。
      usering(self,alias) .using("db2")在setting里面可能有多个数据库。
    上面的方法能够一直.点下去,因为都是queryset对象
下面的方法不能一直点
  values(self,*fields)  获取每行数据为字典格式
  values_list(self,*fields,**kwargs)  获取每行数据为元祖
  date()

  2.xss攻击

      在html中写  |safe

      后台:from django.utils.safestring import mark_safe

          mark_safe(temp)

  3.csrf

  4.模板引擎

    -部分内置方法

    -自定义方法

 

posted on 2018-09-05 17:50  castiel_lee  阅读(98)  评论(0)    收藏  举报

导航