单表操作
表记录的添加
方式一:
Book()
b=Book(name="python基础",price=99,author="yuan",pub_date="2017-12-12")
b.save()
方式二:
Book.objects.create()
Book.objects.create(name="老男孩linux",price=78,author="oldboy",pub_date="2016-12-12")
表记录的修改
方式一:
b=Book.objects.get(author="oldboy")
b.price=120
b.save()
方式二:
#update是QuerySet
Book.objects.filter(author="yuan").update(price=999)
表记录的删除:
Book.objects.filter(author="oldboy").delete()
表记录的查询(重点):
book_list = Book.objects.filter(id=2)
book_list=Book.objects.exclude(author="yuan").values("name","price")
book_list=Book.objects.all()
book_list = Book.objects.all()[::2]
book_list = Book.objects.all()[::-1]
#first,last,get取到的是一个实例对象,并非一个QuerySet的集合对象
book_list = Book.objects.first()
book_list = Book.objects.last()
book_list = Book.objects.get(id=2)#只能取出一条记录时才不报错
ret1=Book.objects.filter(author="oldboy").values("name")
ret2=Book.objects.filter(author="yuan").values_list("name","price")
book_list= Book.objects.all().values("name").distinct()
book_count= Book.objects.all().values("name").distinct().count()
模糊查询 双下划线__
book_list=Book.objects.filter(name__icontains="P").values_list("name","price")
book_list=Book.objects.filter(id__gt=5).values_list("name","price")
多表操作(一对多):
添加记录
publish_id=2
Book.objects.create(name="linux运维",price=77,pub_date="2017-12-12",publish_id=2)
publish=object
Book.objects.create(name="GO",price=23,pub_date="2017-05-12",publish=publish_obj)
查询记录(通过对象)
正向查询:
book_obj=Book.objects.get(name="python")
pub_obj=book_obj.publish----》书籍对象对应的出版社对象
pub_obj.name
反向查询:
pub_obj = Publish.objects.filter(name="人民出版社")[0]
pub_obj.book_set.all().values("name","price")
查询记录(filter values 双下划线__)
人民出版社出版过的书籍与价格
ret=Book.objects.filter(publish__name="人民出版社").values("name","price")
python这本书出版社的名字
ret2=Publish.objects.filter(book__name="python").values("name")
python这本书出版社的名字
ret3=Book.objects.filter(name="python").values("publish__name")
北京的出版社出版书的名字
ret4=Book.objects.filter(publish__city="北京").values("name")
2017年上半年出版过书的出版社的名字
ret5=Book.objects.filter(pub_date__lt="2017-07-01",pub_date__gt="2017-01-01").values("publish__name")
多表操作(多对多):
创建多对多的关系 author= models.ManyToManyField("Author")(推荐)
书籍对象它的所有关联作者 obj=book_obj.authors.all()
绑定多对多的关系 obj.add(*QuerySet)
obj.remove(author_obj)
如果想向第三张表插入值的方式绑定关系: 手动创建第三张表
# class Book_Author(models.Model):
# book=models.ForeignKey("Book")
# author=models.ForeignKey("Author")
Book_Author.objects.create(book_id=2,author_id=3)
掌握:通过 filter values (双下换线)进行多对多的关联查询(形式和一对多)
-------了不起的双下划线(__)之单表条件查询
models.Tb1.objects.filter(id__lt=10, id__gt=1) #获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__in=[11, 22, 33]) 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) not in
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
startswith,istartswith, endswith, iendswith,
--------了不起的双下划线(__)之多表条件关联查询
正向查找(条件)
ret3=models.Book.objects.filter(title='Python').values('id')
print(ret3) [{'id': 1}]
正向查找(条件)之一对多
ret4=models.Book.objects.filter(title='Python').values('publisher__city')
print(ret4) [{'publisher__city': '北京'}]
正向查找(条件)之多对多
ret5=models.Book.objects.filter(title='Python').values('author__name')
print(ret5)
ret6=models.Book.objects.filter(author__name="alex").values('title')
print(ret6)
注意
正向查找的publisher__city或者author__name中的publisher,author是book表中绑定的字段
一对多和多对多在这里用法没区别
反向查找(条件)
反向查找之一对多:
ret8=models.Publisher.objects.filter(book__title='Python').values('name')
print(ret8) [{'name': '人大出版社'}] 注意,book__title中的book就是Publisher的关联表名
ret9=models.Publisher.objects.filter(book__title='Python').values('book__authors')
print(ret9) [{'book__authors': 1}, {'book__authors': 2}]
反向查找之多对多:
ret10=models.Author.objects.filter(book__title='Python').values('name')
print(ret10) [{'name': 'alex'}, {'name': 'alvin'}]
注意
正向查找的book__title中的book是表名Book
一对多和多对多在这里用法没区别
学生表 老师表 班级表
方案一: 学生 多对多 老师表
学生 一对多 班级
方案二: 老师 多对多 班级
学生 一对多 班级