django——单表操作:增删改查

添加记录

from django.shortcuts import render, HttpResponse
from app01.models import Book


def index(request):
    # 添加表结构 两种方式

    # 1、直接实例化对象(引入定义类)
    # sql表对应类,记录对应类实例化对象,字段对应对象的属性

    book_obj=Book(id=1,title='python',price=100,pub_date="2012-1-1",publish='出版社')
    book_obj.save()  # 保存一下,浏览器输入index路径,生成记录

    # 方式二:每个模型表下都有objects管理器,进行增删改查
    book_obj=Book.objects.create(id=2,title='linux',price=100,pub_date="2012-1-1",publish='出版社')
    # create有返回值,返回对象可以打印属性
    print(book_obj.price)
    return HttpResponse('ok')

查询

查询有很多方法,一定要注意,查询方法的返回值,以及谁来调用方法。再次强调下,一个表就是一个类,一条记录就是类的实例化对象object
每个模型表下都有objects管理器,封装了所有的方法进行增删改查。

def index(request):
    # 1. all 方法 
    # 调用者 Book.objects
    # 返回值 queryset 对象,可以理解为列表,里面放着model对象
   
    book_list = Book.objects.all()
   
    print(book_list)
    # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>]>
    # 打印的是所有记录,可以在类book里定义str,指定打印内容。

    for obj in book_list:
        print(obj.title,obj.price)
        # python红宝书 100.00
        # go 100.00
        # linux 80.00 
    print(book_list[1].title)  # go

    # 2. first last  
    # 调用者 queryset 对象,Book.objects.all()
    # 返回值 model对象
    # 不是这个!book = Book.objects.first()
    
    book = Book.objects.all().first()

    print(book)                       # Book object (1)
    print(Book.objects.all()[0])      # Book object (1)
    print(Book.objects.all().last())  # Book object (3)

    # 3. filter 过滤
    # 调用者:Book.objects
    # 返回值 queryset对象
    book_list = Book.objects.filter(price=100)
 
    print(book_list)
    # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>]>
	# 可以结合first,last用   
    print(Book.objects.filter(price=100).first()) # Book object (1)
   # 可以写多个条件
    print(Book.objects.filter(title='go',price=100)) # <QuerySet [<Book: go>]>

    # 4. get  
    # 有且只有一个查询结果时 才有意义,查不到报错,多个结果也报错
    # 调用者 Book.objects
    # 返回值:model 对象
    # get(条件)
    
    book_obj = Book.objects.get(title='linux')
    print(book_obj) # linux   Book object (3)
    
    # book_obj = Book.objects.get(price=100)
    # get()报错: returned more than one Book -- it returned 2!

    # 5. exclude 排除条件 
   	# 调用者 Book.objects
    # 返回值 queryset
    ret = Book.objects.exclude(title='go')
    print(ret)  # <QuerySet [<Book: python红宝书>, <Book: linux>]>

    # 6. order_by 排序 
    # 调用者 queryset 
    # 返回值 queryset 
    # 可以链式操作
    
    ret = Book.objects.all().order_by('id')  # 默认按id 升序
    print(ret)  # <QuerySet [<Book: python红宝书>, <Book: go>, <Book: linux>]>
   
    ret = Book.objects.all().order_by('-id')  # 降序
    print(ret)  # <QuerySet [<Book: linux>, <Book: go>, <Book: python红宝书>]>
   
    ret = Book.objects.all().order_by('price','id')  # price asc 相等 按id asc
   
    # 7. reverse 反转
    ret = Book.objects.all().order_by('id').reverse()
    print(ret)  # <QuerySet [<Book: linux>, <Book: go>, <Book: python红宝书>]>

    # 8. count  
    # 调用者 queryset 
    # 返回值 int
    ret = Book.objects.all().count()
    print(ret)  # 3

    # 9. exists 
    #调用者 queryset 
   	#返回值 true false
   	# 
    ret = Book.objects.all().exists()
    if ret:  # True
        print(ret)

	#重点:
    # 10. values 查询指定字段得数据  
    #调用者 queryset 
    #返回值 queryset ,里面放着字典
    '''
    value的原理:values(price,title):
    temp=[]

    for obj in Book.objects.all()
         temp.append({
             "price"=obj.price
             "title"=obj.title
         })

    return temp
    '''
    
    ret = Book.objects.all().values('price')
    print(ret)
    # <QuerySet [{'price': Decimal('100.00')}, {'price': Decimal('100.00')}, {'price': Decimal('80.00')}]>
    print(ret[0].get("price")) # 100.00
    
    ret = Book.objects.all().values('price','title')
    print(ret)
    # <QuerySet [{'price': Decimal('100.00'), 'title': 'python红宝书'}, {'price': Decimal('100.00'), 'title': 'go'}, {'price': Decimal('80.00'), 'title': 'linux'}]>
   
    # 不加all也可以,不建议。
    ret = Book.objects.values('title')  # 相当于 all().values()
    print(ret)
    # <QuerySet [{'title': 'go'}, {'title': 'linux'}, {'title': 'python红宝书'}]>

    print(ret[0].get('title'))   # go 
    # 字典使用 .get 方法,没有数据时 不会报错

    # 11 values_list  
    # 调用者 queryset 
    # 返回值 queryset 里面放着元祖
    
    ret = Book.objects.all().values_list('price')
   	# <QuerySet [(Decimal('100.00'),), (Decimal('100.00'),), (Decimal('80.00'),)]>
   
    ret = Book.objects.all().values_list('price','title')
    # <QuerySet [(Decimal('100.00'), 'python红宝书'), (Decimal('100.00'), 'go'), (Decimal('80.00'), 'linux')]>

    # 12 distinct 去重 
    #调用者 queryset 
    #返回者 quertset

    # 配合着values() values_list()使用
    ret = Book.objects.all().values('price').distinct()  # 实现了 去重
    print(ret)
    # <QuerySet [{'price': Decimal('100.00')}, {'price': Decimal('80.00')}]>

    # 链式操作
    Book.objects.all().filter().order_by().filter().reverse().first()

    return HttpResponse('OK')

总结

<1> all():                       查询所有结果

  
<2> filter(**kwargs):                它包含了与所给筛选条件相匹配的对象
  
<3> get(**kwargs):               返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                              如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  
<4> exclude(**kwargs):             它包含了与所给筛选条件不匹配的对象
 
<5> order_by(*field):              对查询结果排序
  
<6> reverse():                 对查询结果反向排序
  
<7> count():                      返回数据库中匹配查询(QuerySet)的对象数量。
  
<8> first():                      返回第一条记录
  
<9> last():                      返回最后一条记录
  
<10> exists():                     如果QuerySet包含数据,就返回True,否则返回False
 
<11> values(*field):              返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                             model的实例化对象,而是一个可迭代的字典序列
<12> values_list(*field):           它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
 
<13> distinct():               从返回结果中剔除重复纪录

基于双下划线模糊查询

def index(request):
    # 1. 大于 小于     100 > x > 50
    ret = Book.objects.filter(price__gt = 50,price__lt = 100)

    # 2.以什么开头
    ret = Book.objects.filter(title__startswith='py')
    print(ret) # <QuerySet [<Book: python红宝书>]>

    # 3.包含什么 
    # 大小写敏感
    ret = Book.objects.filter(title__contains='o')
    print(ret) # <QuerySet [<Book: python红宝书>, <Book: go>]>
    
    # 大小写不敏感
    ret = Book.objects.filter(title__icontains='O')
    print(ret)
    # <QuerySet [<Book: python红宝书>, <Book: go>, <Book: linuxO>]>

    # 4.在什么里面,或的关系,不是区间,100,或200,或50
    ret = Book.objects.filter(price__in=[100,200,50])

    # 5. 在什么范围内 100  >=  x >= 50
    ret = Book.objects.filter(price__range = [50,100])

    # 6.在哪一年 哪一月,只有date类型才可以。
    ret = Book.objects.filter(pub_date__year=2018)
    ret = Book.objects.filter(pub_date__year=2018,pub_date__month=3)
    print(ret) # <QuerySet []>

    return HttpResponse('OK')

删除,修改

先查到这个记录再修改或者删除

def index(request):
    # 1 删除  delete()
    # 调用者 queryset  符合条件的全部删除
    # 返回者 元祖
    ret = Book.objects.filter(price=50).delete()
    print(ret) # (1, {'book.Book': 1}) 删除的个数,所属表,一般不用返回值。

    # 2 删除  
    # 调用者 model 对象 精确找到某条记录之后删除
    # 返回者 元祖
    ret = Book.objects.filter(price=100).first().delete()
    print(ret)  # (1, {'book.Book': 1})

    # 3 修改  update()
    # 调用者 queryset 
    # 返回者 int   
    # 只能是queryset调用,model 不能调 update
    
    # ret = Book.objects.filter(title='linux').update(title='linux_go')
    ret = Book.objects.filter(price=100).update(title='lin')
    print(ret)   # 0 / 1 / 2

    # model 不能调 update
    ret = Book.objects.filter(price=80).first().update(title='liliaa')
    print(ret)  # 'Book' object has no attribute 'update'

    return HttpResponse('OK')

猜你喜欢

转载自blog.csdn.net/Light__1024/article/details/88067053