Python-django-ORM增删改查
一,单表增删改查
class Book(models.Model): name = models.CharField(max_length=32) price = models.IntegerField() pub_date = models.DateField() author = models.CharField(max_length=32)
1. 增加数据
方式一:save( )
book=Book(name='python',price=99,pub_date='2020-12-23',author='Jack') book.save()
方式二:create( )
Book.objects.create(name='Java',price=299,pub_date='2020-11-23',author='Jack')
方式三:字典数据插入
data={'name':'PHP','price':56,'pub_date':'2020-10-23','author':'Rose'} Book.objects.create(**data)
2. 更新数据
方式一:update ( ) ; 优先使用,减少一次SQL查询
Book.objects.filter(author='Rose').update(price=345)
方式二:先get,后 update
book=Book.objects.get(author='Rose') book.price=120 book.save()
3. 删除数据
方式一:delete( )
Book.objects.filter(author='Rose').delete()
4. 查询数据
方式一: all( ) ; 结果集为:QuerySet <>
li=Book.objects.all()
方式二: first( ), last( ) ; 结果为obj对象
book=Book.objects.filter(name='PHP').first()
book=Book.objects.filter(name='PHP').last()
方式三: values( ) ; 结果集为:QuerySet <>
li=book=Book.objects.filter(name='java').values('name','price')
<QuerySet [{'name': 'Java', 'price': 299}]>
方式四: values_list( ) ; 结果集为:QuerySet <>
li=book=Book.objects.filter(name='java').values_list('name','price')
<QuerySet [('Java', 299)]>
方式五: exclude( ) , 反向取数据 ,结果集为:QuerySet <>
li=book=Book.objects.exclude(name='java').values_list('name','price')
# 查询除了 name='java'的所有数据
方式六: distinct( ), 去重复,结果集为:QuerySet <>
li=book=Book.objects.values_list('name').distinct()
方式七: count ( ), 统计,结果 int 整数
count=book=Book.objects.all().count()
方式八: 双下划线
li=Book.objects.filter(id__lt=1, id__gt=10) # id 大于等于1 且小于等于10 li=Book.objects.filter(id__in=[1,2,3]) # id 在[1,2,3] 里面的数据 li=Book.objects.exclude(id__in=[1, 2, 3]) # id 不在[1,2,3] 里面的数据 li=Book.objects.filter(name__contains='A') # name包含A的数据 li = Book.objects.filter(name__icontains='A') # name包含A的数据,不含大小写 li = Book.objects.filter(pub_date__range=['2020-12-12','2020-12-23']) # between and # startswith istartswith, endswith,iendswith 以某某开始,以某某结束
二,多表增删改查- 一对多
class Publish(models.Model): # 主表 name = models.CharField(max_length=32) city = models.CharField(max_length=32) def __str__(self): return self.name class Book(models.Model): # 从表 name = models.CharField(max_length=32) price = models.IntegerField() pub_date = models.DateField() author = models.CharField(max_length=32) publish=models.ForeignKey(Publish,on_delete=None) def __str__(self): return self.name
1. 查询一条【从表】里面的数据,然后获取【主表】对象数据
book=Book.objects.get(name='python') publish=book.publish print(publish.name) print(publish.city)
2. 查询一条【主表】里面的数据,然后获取它所对应的所有【从表】里面的数据
2.1. 正向查询
publish=Publish.objects.get(name='北京出版社') books=Book.objects.filter(publish=publish).all() print(books)
2.2. 反向查询 book_set
publish=Publish.objects.get(name='北京出版社') books=publish.book_set.values_list('name','price') print(books)
2.3 双下划线查询
books=Book.objects.filter(publish__name='北京出版社').all() # 查询一个出版社所对应的所有的书
publish_list=Publish.objects.filter(book__name='java').all() # 查询一本书所有对应的出版社
3. 插入数据 ,
3.1 【从表】插入一条数据, 【主表】给一个id, 这个字段是数据库里面的真实字段
Book.objects.create(name='C#',price=56,pub_date='2020-12-21',author='jack',publish_id=3)
3.2 【从表】插入一条数据, 【主表】给一个对象, 这个字段是model里面的属性字段
obj=Publish.objects.get(id=2) Book.objects.create(name='C++',price=56,pub_date='2020-12-21',author='erick',publish=obj)
三,多表增删改查- 多对多
class Teacher(models.Model): name = models.CharField(max_length=32) course=models.ManyToManyField('Course') # 外键添加到两张表任意一张效果都一样 def __str__(self): return self.name # 自动创建第三张表 teacher_course class Course(models.Model): name = models.CharField(max_length=32) lesson=models.IntegerField()
def __str__(self): return self.name
1. 查询
teacher=Teacher.objects.get(id=1) # 查询一个老师所对应的所有课程 course_list=teacher.course.all() course=Course.objects.get(id=4) # 查询一个课程对应的所有老师 teacher_list=course.teacher_set.all() print(teacher_list) print(course_list)
teacher_list=Teacher.objects.filter(course__name='计算机基础') # 查询课程是计算机基础的所有老师 print(teacher_list)
2. add
# 为一个指定的 teacher一次添加多个课程
teacher=Teacher.objects.get(id=4) course_list=Course.objects.all() teacher.course.add(*course_list)
3. remove
# 为一个指定的 teacher一次移除多个课程
teacher=Teacher.objects.get(id=4) course_list=Course.objects.all() teacher.course.remove(*course_list)
四, 聚合函数
from django.db.models import Max,Min,Avg,Count,Sum max=Book.objects.all().aggregate(Max('price')) avg = Book.objects.all().aggregate(Avg('price')) sum=Book.objects.all().aggregate(Sum('price')) count=Book.objects.all().aggregate(Count('price'))
五, 分组
li=Book.objects.values('author').annotate(Sum('price')) # 按照 author 进行分组后,然后计算每组的 price 和
五, F 和 Q 查询
from django.db.models import F,Q Book.objects.filter(id=4).update(price=F('price')+10) # 利用 F函数对price自加
li=Book.objects.filter( Q(id=4) | Q(name='java') ) # 利用 Q 函数进行 或查询 print(li)