http://www.cnblogs.com/liwenzhou/p/8660826.html

 

 day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

 

day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

 

 

day 69 ORM 多表增删改查操作

 

 

 day 69 ORM 多表增删改查操作

 

 day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

 day 69 ORM 多表增删改查操作

 

 

 day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

 

 day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

 

 day 69 ORM 多表增删改查操作

 

 

 

 

下面的代码是在 python console中配置的。 关闭pycharm会消失。

from app01 import models
models.Person.objects.all()
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

day 69 ORM 多表增删改查操作

day 69 ORM 多表增删改查操作

 

 

 

 day 69 ORM 多表增删改查操作

 

import os

if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
    import django
    django.setup()

    from app01 import models

    books = models.Book.objects.all()
    print(books)
  1.查询所有人

  ret = models.Person.objects.all()
  print(ret)
  结果:
  <QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

  
  2.get的查询方法

   ret = models.Person.objects.get(id =1)  #id为 不存在的话会报错
   print(ret)
  结果:
   小黑

  3.filter查询
  
   ret = models.Person.objects.filter(name ="小黑")
   print(ret)
   结果
  
<QuerySet [<Person: 小黑>]>

    为什么会是这个结果因为:

     class Queryset(list):

  4. 查询id大于1的数据

    ret =models.Person.objects.filter(id__gt=1) #如果id等于100 ,不会报错,会返回一个空的QuerySet对象。

   print(ret)
   结果:

    <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>

  5.查询id等于1的数据,并取出里面的数据通过索引的方式取出来
  ret =models.Person.objects.filter(id=1)[0]
  print(ret)
  结果:
  
  小黑
   6.exclude

  
  print('exclude'.center(120,'*'))
  ret =models.Person.objects.exclude(id=1)
  print(ret)
  结果
  ********************************************************exclude*********************************************************

   <QuerySet [<Person: 小黑2>, <Person: 小黑6>]>


  7.values(不写字段名,默认查询所有的字段)
  ret = models.Person.objects.values('birthday')
  print(ret)
  结果

   <QuerySet [{'birthday': datetime.date(2018, 5, 10)}, {'birthday': datetime.date(2018, 5, 25)}, {'birthday': datetime.date(2018, 5, 3)}]>

  8.values_list, 返回一个QuerySet对象,里面都是元组,不写字段,会查询所有

  ret = models.Person.objects.values_list('name','birthday')
  print(ret)
  结果

  <QuerySet [('小黑', datetime.date(2018, 5, 10)), ('小黑2', datetime.date(2018, 5, 25)), ('小黑6', datetime.date(2018, 5, 3))]>



  9 .order_by 对查询结果进行排序
  ret = models.Person.objects.all().order_by('birthday')
  print(ret)
  相当于设置元类 在Person类的下面
  
  class meta:
    ordering =(‘birthday’)

  结果
  <QuerySet [<Person: 小黑6>, <Person: 小黑>, <Person: 小黑2>]>
   10.reverse 将一个有序的QuerySet进行反转
  
  ret =models.Person.objects.all().order_by('birthday').reverse()
  print(ret)
  结果:

   <QuerySet [<Person: 小黑2>, <Person: 小黑>, <Person: 小黑6>]>


  11. count 返回QuerySet中对象的个数

  
  ret =models.Person.objects.all().count()
  print(ret)

  结果
  3

  12. first 返回QuerySet对象中第一个元素
  ret =models.Person.objects.first()
  print(ret)
  结果:
  小黑

  13. last 返回QuerySet对象中最后一个元素
  
  ret =models.Person.objects.last()
  print(ret)
  结果:  
  小黑6

  14. exist 判断表里面有没有数据
  ret =models.Person.objects.exists()#Person表中含有数据 返回True ,如果是空白则为False
  print(ret)
  结果:
  True ,




 二 、单表的双下划线查询

 day 69 ORM 多表增删改查操作

 

1. 查询id值大于1 小于4的结果.
ret = models.Person.objects.filter(id__gt=1,id__lt=4)

print(ret)


结果

<QuerySet [<Person: 小黑2>, <Person: 小黑6>]>



2. IN 操作查询id在【1,3,5,6】
ret = models.Person.objects.filter(id__in=[1,3,5,6])
print(ret)
结果:

<QuerySet [<Person: 小黑>, <Person: 小黑6>]>


3. exclude 排除在这些id的条目
ret = models.Person.objects.exclude(id__in=[1,3,5,6])
print(ret)

结果:

<QuerySet [<Person: 小黑2>]>

4.  name_contains=  (name__icontains 忽略大小写)

ret =models.Person.objects.filter(name__contains="6")
print(ret)
输出结果:

<QuerySet [<Person: 小黑6>]>


5. id_range =

ret =models.Person.objects.filter(id__range=[1,2]) #相当于sql语句的between 1 and 2
print(ret)
结果:

<QuerySet [<Person: 小黑>, <Person: 小黑2>]>

 

  6. 日期和时间字段还可以有以下写法

ret =models.Person.objects.filter(birthday__year=2018)
print(ret)
ret =models.Person.objects.filter(birthday__month=5)
print(ret)

结果:

<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>
<QuerySet [<Person: 小黑>, <Person: 小黑2>, <Person: 小黑6>]>

 

 

 

 三、正向查询

day 69 ORM 多表增删改查操作

 

# 外键的查询操作
# 正向查询 方法一、 #基于对象 跨表查询 book_obj
=models.Book.objects.all().first() ret = book_obj.publisher #出版社对象 print(ret,type(ret))
ret
=book_obj.publisher.name print(ret,type(ret)) # 和我这本书关联的出版社对象.

结果:

  这是沙河第一出版社对象 <class 'app01.models.Publisher'>
  沙河第一出版社 <class 'str'>


正向查询方法二、
# 查询id是1的书的出版社的名称.
#双下划线就表示跨了一张表.
book_obj=models.Book.objects.filter(id=1).values('publisher__name')
print(ret)
结果:

 沙河第一出版社




 

 四、反向查询

day 69 ORM 多表增删改查操作

  

 

# # 反向查询。用set关键字  (基于对象 查询)
publisher_obj =models.Publisher.objects.first()
# ret =publisher_obj.book_set.all()    
# print(ret)

# #另外一种写法 (基于双下滑线) ret =publisher_obj.books.all() #books 为在Book类里设置的related_name 关键字的值 print(ret)

结果:
<QuerySet [<Book: 跟老男孩学linux>, <Book: java>]>


related_name ='books' 反向查询是用来代替book_set的

根据双下划线

ret =modules.Publisher.objects.filter(id=1).value_list('ooxx__tile') #related_query_name ='ooxx'


  day 69 ORM 多表增删改查操作

 day 69 ORM 多表增删改查操作

 

 

 

 

 

五、多对多查询. ManytoManyField 

 

 

# 多对多 1.create
author_obj = models.Author.objects.first()
print(author_obj.name)
#查询小黑1 写过的书
ret =author_obj.books.all()
print(ret)

# 1. create
# 通过作者创建一本书,会自动保存,
# 做了两件事
#1 。在book表里创建一本新书,2.在作者和书的关系表里添加关联
author_obj.books.create(title ='金老板自传',publisher_id =2 )

结果会在book表和book author关系表里自动添加数据。

 

 add

# 2.add
book_boj =models.Book.objects.get(id =8)
author_obj.books.add(book_boj )

# 添加多个
book_objs =models.Book.objects.filter(id__gt=5)
author_obj.books.add(*book_objs) #要把列表打算再传进去.
#直接添加id
author_obj.books.add(9)

 

remove

# remove 从金老板关联的书里吧开船删掉
# book_obj=models.Book.objects.get(title='gen金老板学开船')
# author_obj.books.remove(book_obj)

book_obj =models.Book.objects.get(title="java")
print(book_obj)
author_obj.books.remove(book_obj)

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-25
  • 2022-12-23
  • 2022-12-23
  • 2021-07-22
  • 2021-06-03
猜你喜欢
  • 2022-12-23
  • 2022-02-09
  • 2022-12-23
  • 2022-12-23
  • 2021-05-28
  • 2022-12-23
  • 2021-05-09
相关资源
相似解决方案