67 orm13查询语句,外键查询,多对多查询 单表查询双下划线方法
Posted gyh412724
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了67 orm13查询语句,外键查询,多对多查询 单表查询双下划线方法相关的知识,希望对你有一定的参考价值。
主要内容:https://www.cnblogs.com/maple-shaw/articles/9403501.html
注意: 如果想要文件中运行整个django项目:
需要在文件中写入:
import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_operate.settings") import django django.setup()
1 orm常用的13个查询语句:分为以下四种
a : 获取对象列表:
obj = models.Person.objects.all() obj1 = models.Person.objects.filter(id=1) obj2 = models.Person.objects.exclude(name=‘alex‘) # values 比较特殊, 对象列表中不再是一个一个的对象, 而是一个字典, 里面放着建和值 obj3 = models.Person.objects.all().values() # value_list 也比较特殊, 对象列表中也不在是对象, 而是一个元祖, 里面放着每一行的值, obj4 = models.Person.objects.all().values_list() # print(obj4) # 对对象排序, -号表示可以取反序. obj5 = models.Person.objects.all().order_by(‘id‘) # print(obj5) # 必须在已有排序的基础上进行排序 # obj6 = models.Person.objects.all().order_by(‘id‘).reverse() # 第二种方法: 也可以在models中的MATA方法中的ordering设置根据什么排序 obj6 = models.Person.objects.all().reverse() # print(obj6)
b : 获取对象:
# 如果该条件不存在或者产生多条数据都会报错, 一般不推荐使用. obj7 = models.Person.objects.get(id=1) # first获取第一个对象, 即对应的elast获取最后一个对象. obj8 = models.Person.objects.all().first() obj9 = models.Person.objects.all().last() # obj10 = models.Person.objects.create(name=‘哪吒‘, age=25) # obj10.save() # print(obj10) # distinct 去重
c : 返回数字
obj11 = models.Person.objects.all().count()
d : 返回布尔值
obj12 = models.Person.objects.exclude(id=1).exists()
2 外键查询
class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) press = models.ForeignKey(to=‘Press‘, related_name=‘books‘, null=True)
正向查询:
1 . press_id和press.id的区别
# obj1 = models.Book.objects.get(id=1) # print(obj1.press.id) #从book表中取到press_id , 然后再找到press表中的id = press_id 的对象取出press.id # print(obj1.press_id) #直接从book表里面取数据, 查找一次
2 . 关联字段: 关联字段__字段(跨表)
找到湖南出版社所出版的所有书籍 books = models.Book.objects.filter(press_id=(models.Press.objects.get(name=‘湖南卫视出版社‘)).id)
print(books) 执行流程: 先从 press表中取出id , 根据id = press_id再从book表中title books = models.Book.objects.filter(press__name=‘湖南卫视出版社‘) #使用了连表查询, 查一次. print(books)
print(models.Book.objects.values_list("press__name"))
反向查询:
1 . 获取管理对象:
press_obj = press.objects.get(id = 1)
press_obj.books 获取的是一个管理对象, 设置 related_name=‘books‘
press_obj.books.all() 获取的与该出版社相关的书籍对象列表
2 . 设置和删除对应关系:
obj1 = press.objects.get(id = 2)
obj1.books.set(Book.objects.filter(id__in = [4, 5]))
obj1.books.remove(*Book.objects.filter(id__in = [4, 5])) press字段设置, null = True
3 . 关联字段:
找出快乐大本营该书的出版社
obj = models.Press.objects.filter(id=models.Book.objects.get(title=‘快乐大本营‘).press_id)
print(obj)
obj = models.Press.objects.filter(books__title=‘快乐大本营‘) , #涉及到了一个连表查询, 查一次
print(obj)
3 多对对的查询:
obj = models.Author.objects.get(id__in=[1]) # print(obj) # print(obj.name) print(obj.books.all()) # obj.books.set([2, 3]) # 设置对应关系 # obj.books.add(2,3) obj.books.remove(*models.Book.objects.all()) #删除对应关系
以上是关于67 orm13查询语句,外键查询,多对多查询 单表查询双下划线方法的主要内容,如果未能解决你的问题,请参考以下文章
字段和字段的参数,查询的13个方法,但标的双下划线外键和多对多操作