Django----ORM 对表单的操作

---恢复内容开始---

---------------------------------

---------- 单表操作

---------------------------------

向数据库的表单中添加内容的两种方式

def addbook(request):
    # b=Book(name="python基础",price=99,author="yuan",pub_date="2017-12-12")
    # b.save()      #添加内容的方式一

    Book.objects.create(name="老男孩shell",price=78,author="oldboy",pub_date="2016-12-14")
    # 方式二
    
    return HttpResponse("添加成功")

 

 

修改表单内容的两种方式

def update(request):
    #表记录的修改方式一 推荐用这种方式
    # Book.objects.filter(author="yuan").update(price="999")

    #表记录的修改方式二
    b = Book.objects.get(author="oldboy")
    b.price=120
    b.save()
    return HttpResponse("修改成功!")

 

删除表单内容

def delete(request):

    Book.objects.filter(author="oldboy").delete()

    return HttpResponse("删除成功!")

 

 

 

 

 

---------------------------------

Django查看原生SQL语句logging配置----

--------------------------------------

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

 

 

表记录的查询

def select(request):

    # book_list=Book.objects.all()  #查询列表所有信息
    # print(book_list)
    # print(book_list[0])

    # book_list=Book.objects.all()[:3]  #取前三条
    # book_list=Book.objects.filter(id=2)  #得到的结果是一个集合,只不过只有一个id=2的对象
    # book_list=Book.objects.all()[::2]  #两个两个取,或者说是取一个,隔一个
    # book_list=Book.objects.first()  #取第一个
    # book_list=Book.objects.last()  #取最后一个
    # book_list=Book.objects.get(id=2)  #取一个id=2的对象,,如果按照作者取,加入有两本书有同一个作者,会报错

    ret = Book.objects.filter(author="yuan").values("name","price") #得到的结果是字典
    ret2 = Book.objects.filter(author="yuan").values_list("name","price") #得到的结果是元祖
    print(ret)
    print(ret2)

    #book_list=Book.objects.all().values("name).distinct() #去重
    book_count=Book.objects.all().values("name").distinct().count()
    print(book_count)

    #万能的双下划线 __
    # book_list=Book.objects.filter(price__gt=50).values("name","price")  #__gt是大于,__lt小于
    book_list=Book.objects.filter(name__icontains="P").values("name","price")  #__icontains 包含大小写p.contains只包含P




    return render(request,"index.html",{"book_list":book_list})

 

 

 

 

 

多表操作(一对多):

添加记录:

Book.objects.create(name="linux运维",price=77,pub_date="2017-12-12",publish_id=2) #方式一

publish_obj=Publish.objects.filter(name="人民出版社")[0]
Book.objects.create(name="GO",price=23,pub_date="2017-5-12",publish=publish_obj)#方式二

 

查询记录(通过记录):

  正向查询:

   book_obj=Book.objects.get(name="python")

   pbu_obj = book_obj.publish------>书籍对象对应的出版社对象

   pub_obj.name

  反向查询:

   pub_obj = Publish.objects.filter(name = "人民出版社")

   print(pub_obj.book_set.all().values("name","price"))

 

查询记录(filter values 双下划线__)

  ret = Book.objects.filter(publish__name="人民出版社").values("name","price")
  print(ret)

  

ret = Book.objects.filter(publish__name="人民出版社").values("name","price")
print(ret)

#求Python这本书的出版社的名字
ret2 = Publish.objects.filter(book__name="Python").values("name")
print(ret2)

ret3=Book.objects.filter(name="python").values("publish__name")
print(ret3)


#在北京的出版社出版过的书名
ret4= Book.objects.filter(publish__city="北京").values("name")
print(ret4)
#JAVA 这本书的出版社的所在城市
ret5 = Publish.objects.filter(book__name="JAVA").values("city")
print(ret5)

---------------------------------------------------------------------

 

多表操作(多对多)

  创建多对多关系:authors=models.ManyToManyField("Author")  (推荐)

  书籍对象的所有关联作者  obj=book_obj.authors.all()

      绑定多对多关系      添加关系obj.add(*Queryset)                                 解除关系obj.remove(author_obj)

 

 

 

  手动创建第三张表

# class Book_Author(models.Model):
# book=models.ForeignKey("Book",on_delete=models.CASCADE)
# author=models.ForeignKey("Author",on_delete=models.CASCADE)


掌握:通过 filter values (双下划线)进行多对多的关联查询 (形式和一对多一样)



    

  

多表查询使用聚合函数前需要先倒入:

from django.db.models import Avg,Min,Sum,Max,Count




posted @ 2018-12-18 22:22  阜阳小全  阅读(107)  评论(0编辑  收藏  举报