Django模型层之单表操作

添加表纪录

方式1

create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象
book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")

方式2

book_obj=Book(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
book_obj.save()

def index(request):
    #方式一
    book=Book(name='红楼梦',pub_data='2015-10-12',price=88,publish='老男孩出版社')
    book.save()
    #方式二
    Book.objects.create(name='Python红宝书',pub_data='2010-10-12',price=100,publish='人民出版社')

查询表纪录

查询API

<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():            从返回结果中剔除重复纪录
    # QUerySet数据类型(类似于一个列表,里面放着一些对象)
    # 1 方法的返回值是什么
    # 2 方法的调用者
    # (1) all方法 返回一个QuerySet对象
    book_list=Book.objects.all()
    print(book_list[1].name)
    print(book_list)
    for obj in book_list:
        print(obj.name)
    (2)first last:调用者是queryset对象,返回值是对象
    book=Book.objects.all().first()
    book2=Book.objects.all().last()
    print(book)
    print(book2)
    (3) filter  返回值是queryset对象(相当于where语句)
    可以加多个过滤条件
    book=Book.objects.filter(name='红楼梦').first()
    print(book)
    (4)get方法 有且只有一个查询结果才有意义 返回值是一个对象
    book=Book.objects.get(name='红楼梦')
    print(book)
    直接报错
    book = Book.objects.get(name='红楼梦eee')
    --------------最常用-----------------
    (5)exclude 除了查询之外的 返回值也是queryset
    ret=Book.objects.exclude(name='红楼梦')
    print(ret)
    (6)order_by(默认升序,加个- 就是降序),可以多个过滤条件调用者是queryset返回值也是queryset
    book_list=Book.objects.all().order_by('id')
    book_list=Book.objects.all().order_by('-id','price')
    print(book_list)
    (7)count() 调用者是queryset,返回值是int
    ret=Book.objects.all().count()
    print(ret)
    (8)exist()判断是是否有值,不能传参数,
    ret=Book.objects.all().exists()
    print(ret)
    # (9)values方法
    # 查询所有书籍的名称(里面传的值,前提是表有这个字段)也是queryset但是里面放的是字典
    '''
    values原理
    temp=[]
    for obj in Book.objects.all():
        temp.append({'name':obj.name})
    '''
     ret=Book.objects.all().values('name')
    print(ret)
   不加.all()也可以,调用是queryset返回值也是queryset
    ret=Book.objects.values('price')
   print(ret)
  (10)value_list
    ret=Book.objects.all().values_list('price','name')
     print(ret)
    (11) distinct  seletc * 的时候没有意义
     SELECT DISTINCT name from app01_book;
  没有任何意义,不要这样么用
    Book.objects.all().distinct()
    ret=Book.objects.all().values('name').distinct()
    print(ret)

基于双下划线的模糊查询

    # 双下划线模糊查询-----------------------
    # 查询价格大于100的书
    ret=Book.objects.filter(price__gt=100)
    print(ret)
    # 查询大于50小于100的书
    ret=Book.objects.filter(price__gt=50,price__lt=100)
     print(ret)
    # 查询已红楼开头的书
   ret=Book.objects.filter(name__startswith='红楼')
     print(ret)
    # 查询包含‘红’的书
    ret= Book.objects.filter(name__contains='红')
   print(ret)
    # icontains  不区分大小写
    # 价格在50,88,100 中的
    ret=Book.objects.filter(price__in=[50,88,100])
   print(ret)
    # 出版日期在2018年的
   ret=Book.objects.filter(pub_data__year=2015,pub_data__month=2)
    print(ret)

删除表纪录

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如:

model_obj.delete()

你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。

例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:

Entry.objects.filter(pub_date__year=2005).delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用:

Entry.objects.all().delete() 

如果不想级联删除,可以设置为:

pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)
    # delete:调用者可以是queryset也可以是model对象
    # 删除价格为188的书有返回值 (1, {'app01.Book': 1}) 删除的个数,那张表,记录数
     ret=Book.objects.filter(price=188).delete()
     print(ret)
     ret=Book.objects.filter(price=100).first().delete()
     print(ret)

修改表纪录

Book.objects.filter(title__startswith="py").update(price=120

此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

    # 修改 update只能queryset来调用 返回值为int
   ret=Book.objects.filter(name='红楼梦1').update(name='红楼梦')
     print(ret)
     报错
    Book.objects.filter(name='红楼梦').first().update(name='红楼梦1')

   ret=Book.objects.filter(name='红楼梦1').first()
   print(ret.delete())
    aa=Publish.objects.filter(name='人民出版社')
    print(type(aa))
    aa.delete()

    return HttpResponse('ok')

你可能感兴趣的:(Django模型层之单表操作)