数据表的创建:
python manage.py makemigrations
python manage.py migrate
后台管理注册:
admin.site.register()
创建超级用户:
python manage.py createsuperuser
>>>models创建基本 class Book(models.Model): name=models.CharField(max_length=20) price=models.IntegerField() p_date=models.DateField() author=models.CharField(max_length=32,null=False) class Author(models.Model): name=models.CharField(max_length=32)
增删改查操作
增 方法一: b=Book(name="python",price=99,author="yuan",p_date="2017-12-12") b.save(); 方法二: Book.objects.create(name="老男孩",price=99,author="yuan",p_date="2017-12-12") #推荐************
删 Book.objects.filter(author="alex").delete()
改 方法一: Book.objects.filter(author="yuan").updat(price=109) #推荐************ 方法二: b=Book.objects.get(author="alex") b.price=120 b.save()
查 Book.objects.filter(id=2) #拿到id=2的结果 Book.objects.filter(id=2).values("name","price") #拿到一个列表 内部是一个个字典 Book.objects.filter(id=2).values_list("name","price") #拿到一个列表 内部是一个个元祖 Book.objects.get(id=2) #只能取到一条记录才不会报错 Book.objects.first() #拿到第一条结果 Book.objects.last() #拿到最后一条结果 Book.objects.all() #拿到所有结果 Book.objects.all()[::2] #步长为2 Book.objects.exclude(id=2) #拿到除id=2数据以外的结果 Book.objects.all().values("name").dictinct() #去除name字段重复的结果 Book.objects.all().values("name").dictinct().count() #去除name字段重复的结果之后的数条数 ##支持切片操作 Book.objects.all()[::-1] #拿到所有结果倒叙 Book.objects.all()[::2] #步长为2 #模糊查询 Book.objects.all(price__gt=50).values() #查询price>50的数据 Book.objects.filter(price__gt=50).values() Book.objects.filter(name__contains="p").values() #查询name字段中含有p的 icontains="p"(不区分大小写) __gt(>) __gte(>=) __lt(<) __lte(<=) __exact(=)
一对多(ForeignKey):外键建立在多的一方
views
#反向查询
方法三:
ret = Book.objects.filter(publish__name="宁波出版社").values()
print(ret) #正向查询
#python这本书出版社的名字
方法一:
ret = Book.objects.filter(name="python").values("publish__name") #通过book查找
print(ret)
方法二:
ret = Publish.objects.filter(book__name="python").values("name") #通过publish查找
print(ret)
通过外键渲染到模板
>>>models class Student(models.Model): student_id = models.IntegerField() student_name = models.CharField(max_length=10) student_sex = models.CharField(max_length=5) student_boss = models.ForeignKey('Teacher',on_delete=models.CASCADE) class Teacher(models.Model): teacher_name = models.CharField(max_length=5) >>>views def demo(request): student_list = Student.objects.all() return render(request,'demo.html',locals()) >>>html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for item in student_list %} <p>{{ item.student_boss.teacher_name }}</p> {% endfor %} </body> </html>
多对多(ManyToManyField):
书籍对象的关联作者 obj=book_obj.author.all()
绑定多对多的关系 obj=add()
obj.remove(author_obj)
聚合函数使用
from django.db.models import Avg,Min,Sum,Max #需要导入views
ret = Book.objects.all().aggregate(Min("price")) #聚合函数的使用
print(ret)
ret = Book.objects.filter(author__name="作者1").aggregate(Sum("price")) #过滤信息后查询
print(ret)
# F 和 Q 使用查询条件的值,专门取对象中某列值的操作
# from django.db.models import F # models.Tb1.objects.update(num=F('num')+1)
# Q 构建搜索条件 from django.db.models import Q #1 Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询 q1=models.Book.objects.filter(Q(title__startswith='P')).all() print(q1)#[<Book: Python>, <Book: Perl>] # 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。 Q(title__startswith='P') | Q(title__startswith='J') # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合 Q(title__startswith='P') | ~Q(pub_date__year=2005)