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)

 

posted @ 2021-01-25 23:02  leungqingyun  阅读(124)  评论(0编辑  收藏  举报