Django中的数据库操作

1、通过视图向数据库中增加数据

  • 1、Entry.objects.create(属性1=值1,属性2=值2)
# urls.py
urlpatterns = [url(r'^add_data/$', add_data_views)]  # 配置视图函数

# views.py
from django.http import HttpResponse
from .models impotr *   # 导入实体类

def add_data_views(request):   # 定义视图函数
	Author.objects.create(name='Sam', age=33, email='[email protected]')
	# 在Author表中插入数据,字段为name,age,email
	return HttpResponse('ADD OK')
  • 2、创建一个视图对象,通过save()方法完成
    • obj = Entry(属性1=值1,属性2=值2)
    • obj.save()
# urls.py
urlpatterns = [url(r'^add_data/$', add_data_views)]  # 配置视图函数

# views.py
from django.http import HttpResponse
from .models impotr *   # 导入实体类

def add_data_views(response):   # 定义视图函数
	author = Author(name='Jean', age=36, email='[email protected]')
	# 在Author表中插入数据,字段为name,age,email
	author.save()
	return HttpResponse('ADD OK')
  • 3、通过字典创建视图对象,再调用save()
# urls.py
urlpatterns = [url(r'^add_data/$', add_data_views)]  # 配置视图函数

# views.py
from django.http import HttpResponse
from .models impotr *   # 导入实体类

def add_data_views(response):   # 定义视图函数
	dic = {	'name': 'Jack',
			'age': 41,
			'email': '[email protected]'}
   	author = Author(**dic)
   	author.save()  
	# 在Author表中插入数据,字段为name,age,email
	author.save()
	return HttpResponse('ADD OK')

2、查询操作

  • 所有的查询都要在Entry.objects 的基础上完成
  • 1、基本查询操作 all()
    • 用法:Entry.objects.all()
    • 相当于 select * from ……
    • 返回:QuerySet (查询结果集 )
# urls.py
urlpatterns = [url(r'^select_data/$', select_data_views)]  # 配置视图函数

# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models impotr *   # 导入实体类

def select_data_views(request):   # 定义视图函数
	data = Author.objects.all()
	print(data)
	# <QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>
	# 查询Author表中的所有数据
	return render(request, 'show_data.html', locals())
	# locals() 就是将data封装成一个字典传到show_data.html中
<body>
	{% for author in data %}
		<p>id:{{author.id}}</p>
		<p>name:{{author.name}}</p>
		<p>age:{{author.age}}</p>
		<p>email:{{author.email}}</p>
	{% endfor %}
	<!-- 循环取查询结果,并展示各字段的值 -->
</body>
  • 2、基本查询操作 all().values(‘列名’) django2版本支持多列查询
    • 用法:entry.all().values(‘name’)
    • 相当于 select name from ……
    • 作用:查询所有记录的某一项的值
  • 3、基本查询操作 all().values_list(‘列名1’,‘列名2’) django1版本支持,2版本不支持
    • 用法:entry.all().values_list(‘name’,‘age’)
    • 相当于 select name,age from ……
def select_data_views(request):  
	data = Author.objects.all().values('name','age')  # django 2版本写法
	data = Author.objects.all().values_list('name','age') #django 1版本写法
	return render(request, 'show_data.html', locals())
  • 4、基本查询操作 get()
    • 只能返回一条记录
    • 如果查询返回多条记录,则报错
    • 用法:entry.objects.get(id=4,name=‘张三’)
    • 相当于:select * from …… where id=4 and name=‘张三’
	def select_data_views(request):  
	data = Author.objects.get(id=3)
	return render(request, 'show_data.html', locals())
  • 5、基本查询操作 exclude()
    • 作用:对给定的条件取反
    • 用法:entry.objects.exclude(id=3,age=27)
    • 相当于:select * from …… where not (id=3 and age=27)
  • 6、基本查询操作 order_by()
    • 作用:排序
    • 用法:entry.objects.order_by(‘name’,’-age’)
    • 相当于:select * from …… order by name,age desc
    • 默认为升序排序,需要降序排列时,只需要在列名前加“-”号
  • 7、filter()
    • 根据自定义条件查询结果集,可以是一个,也可以是多个,如果是多个用逗号隔开
    • 如果条件是多个,内部用 AND 进行连接
    • 使用Entry的属性作为filter()的条件
      • 用法:author.objects.filter(id=1)
      • 相当于:select * form author where id=1
      • author.objects.filter(id=1,name=‘Sam’)
      • 相当于:select * from author where id=1 and name=‘Sam’
    • 使用 Filed Lookups(查询谓词)
      • __exact:等值判断
        • Entry.objects.get(id__exact=14)
          Entry.objects.get(id__exact=None)
        • SELECT … WHERE id = 14;
          SELECT … WHERE id IS NULL;

Filed Lookups参考文档

3、修改操作

  • 1、修改单个对象
    • 1、通过get()得到要修改的实体对象
    • 2、通过实体对象修改属性值
    • 3、再通过实体对象的save()函数,实现保存
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect

def select_data_views(request):
    data_list = Author.objects.all()
    return render(request, 'show_author.html',locals())
    
def updata_views(request):
    author = Author.objects.get(id=1)
    author.name = 'Jame'
    author.save()
    # 跳转到select_data_views的视图,请求转发,url为localhost:8000/music/updata_data
    # return select_data_views(request)
    
    # 使用重定向的方式完成视图的跳转,url为localhost:8000/music/select_data
    return HttpResponseRedirect('/music/select_data/')
  • 2、批量修改(修改查询结果集)
    • 调用update()函数
    • Author.objects.all().update(属性=值,……)

请求的转发流程图(updata将request转发给select,url地址不变)

浏览器 updata_views select_data_views request select_data_views(request) response response 浏览器 updata_views select_data_views

重定向流程图(浏览器发送了两次request,url地址改变)

浏览器 updata_views select_data_views request HttpResponseRedirect() request response 浏览器 updata_views select_data_views

4、删除操作

  • 1、删除单个对象
    • obj = Author.objects.get(id=1)
    • obj.delete()
  • 2、批量删除
    • obj= Author.objects.all()
    • obj.delete()

5、F和Q操作

  • 1、F()操作
    • 作用:在执行中获取某列的值
    • 语法:F(‘列名’)
    from django.db.models import F
    Author.objects.all().update(age = F('age') + 10)	# 所有人的年龄加10
    # update author set age = age+10  
    
  • 2、Q()操作
    • 作用:条件的关联,实现或的操作(or)
    • 语法:Q(‘条件’)
    from django.db.models import Q
    Author.objects.filter(Q(age__gt=30)|Q(name='Sam'))
    # select * from author where age>30 or name='Sam'
    

6、原生数据库操作

  • 1、查询
    • 函数:raw()
    • 语法:Entry.objects.raw(sql)
    def raw_views(request):
    	sql = "select * from index_author where email like '%%@qq.com';"
    	author_list = Author.objects.raw(sql)
    	return render(request, 'raw.html', locals())
    
  • 2、增删改(很少用)
    def sql(request):
    	with connection.cursor() as cursor:  # 数据库游标
    		sql = 'delect from author;'
    		cursor.execute(sql)
    	return render(request, 'show_author.html',locals())
    
发布了75 篇原创文章 · 获赞 87 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43883022/article/details/90239128