Django(004)

查询

all()方法

用法:MyModel.objects.all()
作用:查询MyModel实体中的所有数据
等同与 " select * from table " 
返回值:QuerySet容器对象,内部存放MyMdeol实例(数组)
例:
  from bookstore.models inport Book
  books = Book.objects.all()
  for book in books:
      print('书名:',book.title)

可以在模型类中定义一个__str__方法,自定义QuerySet中输出格式,例:
    def __str__(self):
        return '%s_%s_%s_%s'%
            (self.title,self.price,self.pub,self.market_price)

values()方法

用法:MyModel.objects.values(字段名)
作用:查询部分列的数据并返回
等同于 select 字段 from xxx
返回值:QuerySet(内部存放字典)
例:
  from bookstore.models inport Book
  books = Book.objects.all()
  for book in books:
      print('书名:',book['title'])

values_list()方法

用法:MyModel.objects.values_list(字段名)
作用:返回元组形式的查询结果
等同于 select 字段 from xxx
返回值:QuerySet(内部存放元组)
例:
  from bookstore.models inport Book
  books = Book.objects.all()
  for book in books:
      print('书名:',book[0])

order_by()方法

用法:MyModel.objects.order_by(字段名)
默认是升序排序,若要降序,则在字段名前加一个 '-'

【对于QuerySet值,可以用query()方法查看数据查询语句】

条件查询

filter(条件)

语法:MyModel.objects.filter(属性=值...)
作用:返回包含此条件下的数据
返回值:QuerySet类型
例:类名.objects.filter(属性=值)

exclude(条件)

语法:MyModel.objects.exclude(条件)
作用:返回不包含此条件的数据
返回值:QuerySet类型
例:类名.objects.filter(属性=值)

get(条件)

语法:MyModel.objects.get(条件)
作用:返回满足条件的唯一数据(如果结果有多条数据,就会抛错;结果没有数据也会报错)
返回值:不属于QuerySet类型
例:类名.objects.filter(属性=值)

查询谓词

定义:为了更灵活的条件查询
说明:每一个查询谓词都有独立的查询功能
1. __exact:等值匹配
    字段__exact=值
    例:Author.objects.filter(id__exact=1)
       等同于 select * from author where id = 1
2. __contains:包含指定值
    字段__contains=值
    例:Author.objects.filter(name__contains='w')
       等同于 select * from author where name like '%w%'
    相似的还有:  
        __startswith:以xxx开始
        等同于 select * from author where name like 'w%'
        __endswith:以xxx结束
        等同于 select * from author where name like '%w'
3. __gt:大于指定值
    字段__contains=值
    例:Author.objects.filter(age__gt=50)
       等同于 select * from author where age > 50
    相似的还有:
        __gte:大于等于
        __lt:小于
        __lte:小于等于
4. __in:查找数据在指定范围内
    字段__in=[范围]
    例:Author.objects.filter(country__in=['中国','日本','韩国'])
       等同于 select * from author where country in ('中国','日本','韩国')
5. __range:查找数据在指定区间范围内
    字段__range=(区间)
    例:Author.objects.filter(age__range=(35,50))
       等同于 select * from author where age between 35 to 50

改写数据(单个数据)

先查询到数据,在进行改写
1. 变量 = 类.objects.get(id=值).字段 = 值
2. 变量.save()

改写数据(批量数据)

先获得QuerySet数据,在update(属性=值)
1. 变量 = 类.objects.filter(属性=值)
2. 变量.update(字段=更新值)

删除数据(单个数据)

1.先查找数据
2.使用delete()方法实现删除
例:
    try:
        auth = Author.objects.get(id = 1)
        suth.delete()
    except:
        print('出错')

删除数据(批量数据)

1.查找满足条件的QuerySet集合对象
2.使用delete()方法实现删除
例:
    auths = Author.objects.filter(age_gt = 65)
    auths.delete()

伪删除[并没有真正删除]

在表中添加一个布尔类型的字段(is_active),默认是True,执行删除时,把数据改为False
在查询数据时,添加is_active=True进行过滤

F对象

一个F对象代表数据库中某条记录的字段信息
作用:-通常是对数据库中的字段值在不获取的情况下操作
     -用于类属性字间的比较
【便于对一列数据同一操作 (例:所有价格上涨10元) 】
语法:
    from django.db.models import F
    F('列名')
例:
    Book.objects.all().update(market_price=F('market_price')+10
sql语句:
    'UPDATE `bookstore_book` SET `market_price` = (`bookstore_book`.`market_price` + 10)

资源竞争问题:
topic = Topic.objects.get(id=topic.id)
new_like = topic.like + 1
topic.like = new_like
topic.save()
注意:还可以解决资源竞争问题(避免请求过多)
    topic.like = F('like') + 1
    topic.save()
sql语句:
    update topic set like = like +1 where id = xxx

Q对象

专门解决逻辑 或, 逻辑 非 等操作
运算符:    
    &   与操作
    |   或操作
    ~   非操作
语法:
    条件1或条件2成立         Q(1)|Q(2)
    条件1和条件2同时成立      Q(1)&Q(2)
    条件1成立且条件2不成立    Q(1)&~Q(2)
例:
    from django.db.models import Q
    Book.objects.filter(Q(price__lt=20)|Q(pub='xxx'))
上一篇:【产品经理实战项目系列教程】笔记004:产品经理应该具备的能力及如何学习;


下一篇:Web前端学习第一天—————HTML篇.004个人简历制作