模型层之单表

单表操作   数据:增,查,删,改

 增加记录

    # *********增*********

    # 第一种方式 注意时间格式 推荐第一种
    # import datetime
    # now = datetime.datetime.now()
    # book = Book.objects.create(name='红楼梦',price=10,pub_date='2018-01-01',author='xjj',publish='北京出版社')
    # Book.objects.create(name='西游记',price=20,pub_date=now,author='egon',publish='上海出版社')
    # 第二种方式
    # book1 = Book(name='水浒传',price=30,pub_date='2018-01-02',author='lqa',publish='广州出版社')
    # book1.save()
    #
    # print(now) #2018-09-07 20:35:21.296465
    # print(book) #Book object
    # print(book1) #Book object

 查找记录

    # *********查*********

    # filter(--queryset对象)相当于sql的where 后面传的参数,都是and
    # books = Book.objects.filter(name='红楼梦')
    # print(books)            #<QuerySet [<Book: Book object>]>
    # print(books.first())    #Book object
    # print(books.first().id) #1
    # print(books[0].id)      #1

    # all() 拿所有的--queryset对象
    # books = Book.objects.all()
    # print(books)  #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>

    # first() 从queryset里取出第一个值---->book对象
    # books = Book.objects.all().first()
    # print(books)  #Book object

    # last()
    # books = Book.objects.all().last()
    # print(books) #Book object
    # Book.objects.all()[-1]  #报错

    # get只能用来查,返回一条数据的情况,多,少,都报错 用于属性是unique属性字段的
    # books = Book.objects.get(name='西游记')
    # print(books)  #Book object

    # values 对应到sql相当于 selet  这里的东西 from book---返回QuerySet对象
    # 一旦返回是queryset对象,可以继续点它的方法
    # book=Book.objects.all().values('name','price').filter(name='Pyhon开发').filter(id=4).values('id')
    # books = Book.objects.all().values('name','price').first()
    # print(books)  #{'name': '红楼梦', 'price': Decimal('10.00')}

    # values_list 对比values   values_list:queryset里放元组, values:queryset里放字典
    # books = Book.objects.all().values_list('name','price')
    # print(books) #<QuerySet [('红楼梦', Decimal('10.00')), ('西游记', Decimal('20.00')), ('水浒传', Decimal('30.00'))]>

    # exclude 除XX以外的
    # books = Book.objects.all().exclude(name='西游记')
    # print(books) #<QuerySet [<Book: Book object>, <Book: Book object>]>

    # order_by 默认从小到大,想从大到小-
    # books = Book.objects.all().order_by('price') #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    # books = Book.objects.all().order_by('-price') #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    # print(books)

    # count  返回数值---不能继续点了
    # count = Book.objects.all().count()
    # print(count) #3

    # exists 判断queryset里有没有数据,没有就是false,有就是true
    # res=Book.objects.all().exists()
    # print(res)  #True

    # distinct() 去重复
    # res = Book.objects.values('publish').distinct()
    # print(res) #<QuerySet [{'publish': '北京出版社'}, {'publish': '上海出版社'}, {'publish': '广州出版社'}]>
    # 这种无意义,因为每条记录对象都不同 最起码id不同
    # res = Book.objects.all().distinct()
    # print(res) #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>

    # reverse 对查询结果反向排序 只能和order_by连用
    # books = Book.objects.all().order_by('-price').reverse() #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    # 相当于
    # books = Book.objects.all().order_by('price') #<QuerySet [<Book: Book object>, <Book: Book object>, <Book: Book object>]>
    # books = Book.objects.all().order_by('-price','pub_date').reverse()
    # 相当于
    # books = Book.objects.all().order_by('price','-pub_date')
    # print(books)

    return HttpResponse('ok')

'''
<1> all():                  查询所有结果
<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
<5> order_by(*field):       对查询结果排序('-id')
<6> reverse():              对查询结果反向排序

<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。

<9> first():                返回第一条记录

<10> last():                返回最后一条记录

<11> exists():              如果QuerySet包含数据,就返回True,否则返回False

<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                            model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

<14> distinct():            从返回结果中剔除重复纪录

补充:链式调用,定义类返回自己
'''

基于双下划线的模糊查询
#基于双下划线的模糊查询 
#类比sql原生的like

# 不连续范围
Book.objects.filter(price__in=[100,200,300])
# 连续范围
Book.objects.filter(price__range=[100,200])

# 大于等于和小于等于
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)

# 包含xx    icontains不区分大小写
Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python")

# 以xx开头  以xx结尾
Book.objects.filter(title__startswith="py")
Book.objects.filter(title__endswith="py")

# 把日期截断取值比较
Book.objects.filter(pub_date__year__gt=2012)
Book.objects.filter(pub_date__month=12)
Book.objects.filter(pub_date__day=12)

补充:大于等于并且小于等于
#     ret1=Book.objects.filter(price__range=[1,100])
#     ret2 = Book.objects.filter(price__gte=1,price__lte=100)

更新数据 update()

# 更新 修改表记录 update()
# 更新 返回结果是int类型,只能queryset对象来调,对象不能来调

# ret=Book.objects.all().filter(price=51) # ret=Book.objects.all().filter(price=51).update(name='后楼梦') 可以 # ret=Book.objects.all().filter(price=51).first() 不行 # ret.update(name='水浒传') # print(ret)

删除数据 delete()

# 删除 生产环境一般不删除
# 对象和queryset 都可以删除 返回值也一样

# ret=Book.objects.filter(name='水浒传').delete() # ret=Book.objects.filter(name='红楼梦').first().delete() # (1, {'app01.Book': 1}) 1 影响一条记录 那个表的记录 1 影响这个表的记录 # print(ret) # 这不可以 manager对象 # ret=Book.objects.delete() # 这个可以 # ret=Book.objects.all().delete()

django终端打印sql语句

settings中追加即可

ps:print(ret.query)  queryset对象的query方法,也可以打印原生sql


LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }

python脚本中调用django环境

views中设置

一般模式:浏览器请求,查看服务端

改进版:直接右键运行,学习阶段使用,以后不会使用,了解


# 这样就不用启动django了,在浏览器访问,在看打印内容
# 直接右键运行即可,单表,多表操作快一些

import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangotest08.settings") #settings中复制过来
import django #导入django
django.setup() #启动django

# from app01 import models #导入模型
from app01.models import * #导入模型


# books = models.Book.objects.all() #sql语句部分
# print(books)


练习:

    # 查询老男孩出版社出版过的价格大于200的书籍
    # 查询2017年8月出版的所有以py开头的书籍名称
    # 查询价格为50, 100或者150的所有书籍名称及其出版社名称
    # 查询价格在100到200之间的所有书籍名称及其价格
    # 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)

    ret = Book.objects.filter(publish='老男孩出版社',price__gt=200)
    ret = Book.objects.filter(price__contains='2017-08',name__startswith='py')
    ret = Book.objects.filter(price__in=[50,100,150]).values('name','publish')
    ret = Book.objects.filter(price__range=[100,200]).values('name','price')
    ret = Book.objects.filter(publish='人民出版社').values('price').order_by('price').reverse().distinct()
原文地址:https://www.cnblogs.com/xujinjin18/p/9607222.html