本文共 6616 字,大约阅读时间需要 22 分钟。
Django映射类去增加数据库数据
本文创建数据库的表映射出来是这样 class Subject(models.Model): no = models.AutoField(primary_key=True) name = models.CharField(max_length=20) intro = models.CharField(max_length=1000, blank=True, null=True) is_hot = models.IntegerField(blank=True, null=True) #这里用IntegerField,修改的时候写0,1 #is_hot = models.BooleanField(blank=True, null=True) 用BooleanField,修改时写True,Flase class Meta: managed = False #如果改为True,可以通过类去修改数据库的表。如果为假,则是不可以 db_table = 'tb_subject'打开当前虚拟环境终端(django)命令行工具 输入: python manage.py shell 可以进入django交互式环境
Django模型操作数据库代码
#增加数据 subject = Subject(name='Python全栈开发',intro='当下最热门学科',is_hot=True) subject.save()#删除数据 subject = Subject.objects.get(no=2) subject.delete()#修改数据 subject = Subject.objects.get(no=2) subject.name = '...' subject.save()#查询数据 subject = Subject.objects.get(no=1) subject ''' 可用名字查,可能查到同名的所有数据 subject = Subject.objects.filter(name='..') '''#查询所有数据 --会拿到一个容器 subjects = Subject.objects.all() subjects# 悲观锁(多进程查询之前必须拿到锁才能继续,否则阻塞) subject = Subject.objects.select_for_update().get(no=1)# 乐观锁(查询不加锁,更新时做判断)
如果要使用Django模型管理的话,需要数据迁移
当前虚拟环境下输入: python manage.py migrate #把Django框架自带的模型类,变成数据库的表(迁移10张表到数据库)创建超级管理员账号,终端再次输入: python manage.py createsuperuser #会让输入账号,邮箱,密码。 本文用admin账号,这步操作完就可以登录Django后台管理系统了注册模型 在应用下找admin.py文件中(本文创建的应用是polls/admin.py) from django.contrib import admin from polls.models import Subject #导入模型类 --添加这句 admin.site.register(Subject) #注册模型 --添加这句 完成后可刷新django管理页汉化模型 在应用下找models.py文件中(本文创建的应用是polls/models.py).在Meta类中添加代码 class Meta: managed = False db_table = 'tb_subject' verbose_name = '学科' #添加这句 这是单数形式,只添加这句name后加s为复数 verbose_name_plural = '学科' #添加这句 复数也显示name,不加s 如果想汉化数据页面的语言,可以在数据库的表映射出来的类属性后面加上verbose_name='别名'.例如: no = models.AutoField(primary_key=True,verbose_name='编号') name = models.CharField(max_length=20,verbose_name='名称')自定义模型显示方式 点击学科表,不会显示具体数据,只显示主键.找到polls/admin.py 修改数据 from django.contrib import admin from polls.models import Subject class SubjectModelAdmin(admin.ModelAdmin): #定义新类继承django中admin.ModelAdmin的类 list_display = ('no','name','intro','is_hot') #查询数据都显示那些数据 search_fields = ('name',) #添加搜索框 list_per_page = 20 #每页存放的数据 list_filter = ('yi_name',) #可以根据条件筛选 ordering = ('no',) #主键排序 ('-主键')降序,('主键')升序 admin.site.register(Subject,SubjectModelAdmin) #把数据库的表映射到后台管理系统上simpleui中admin的基本配置信息(settings中)SIMPLEUI_ANALYSIS = False #关闭分析(一般加在settings中,这个框架默认采集信息,默认开启)SIMPLEUI_HOME_INFO = False #关闭服务器信息SIMPLEUI_LOGO = 'https://avatars2.githubusercontent.com/u/13655483?s=60&v=4' #修改logo (admin中)admin.AdminSite.site_header = '商品信息管理' #修改登陆页的标题admin.AdminSite.site_title = '商品信息管理' #修改登陆页面的标题admin中如果要上传文件的话(例如图片)1.在项目下新建文件夹(例如:media)#数据库中必须有Field字段2.MEDIA_URL = "/media/" # 设置获取文件时的访问根路径 (访问的路径) #访问时,会加上这个路径,如果数据库中是绝对路径则不需要3.MEDIA_ROOT = os.path.join(BASE_DIR, "media")#设置上传图片的文件夹(存入的路径)#此时数据库中存的是文件名,如果访问的话,会自动加上/media/这个路径4.主urls中添加访问路由from django.urls import re_pathfrom django.views.static import serveurlpatterns = [ re_path(r'media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}), ]
渲染subjects.html
在视图views.py中 def show_subjects(request): subujects = Subject.objects.all().order_by('-no') #获取到数据库中表的所有数据,order_by('-no')降序 res = render(request,'subjects.html',{ 'subjects':subujects #渲染数据到subjects.html中 }) return HttpResponse(res) #返回一个渲染后的html文件(response对象)
Django中放静态资源
一般放主项目路径下My_django/static/css images js (本文项目为My_django,static文件自己创建)修改setting.py文件,创建后最底下会多出一行代码STATIC_URL = '/static/'如果没有自己添加STATICFILES_DIRS = [os.path.join(BASE_DIR,'static'),] #添加这句STATIC_URL = '/static/' #添加这句 --在文件末行修改完成找到html文件中的存放静态资源的src修改资源路径 示例:<img src="static/images/hot-icon-small.png"> #最后部署项目不是这种方式访问静态资源
Django超链接跳转对应的视图函数
修改subject.html {% for subject in subjects %} <dl> <dt> #改了这句 <a href="teachers/?subject_no={ { subject.no }}">{ { subject.name }}</a> {% if subject.is_hot %} <img src="static/images/hot-icon-small.png"> {% endif %} </dt> <dd>{ { subject.intro }}</dd> </dl> {% endfor %} #href后改为点击后访问的视图函数地址在views.py中写跳转后的视图函数 def show_teachers(request : HttpResponse) -> HttpResponse: teachers = None res = render(request,'teachers.html',{ 'teachers':teachers )} return HttpResponse(res)在urls.py中添加访问链接:path('teachers/',show_teachers),##完成这步可以访问teachers页面,但是由于老师数据库模型还没搭建,所以只会显示静态资源
深入模型Django模型 --查询(这里以此项目为例)
查询所有数据 Subject.objects.all()过滤数据 Subject.objects.filter(name='Python全栈开发+人工智能') #查询名为'Python全栈开发+人工智能'的学科 (精准查询) Subject.objects.filter(name__contains='全栈') #查询名为'全栈'的学科 (模糊查询) Subject.objects.filter(is_hot =True) #查询热门学科,模型里面为True的字段 (精准查询) Subject.objects.filter(no__gt=3).filter(no__lt=10) Subject.objects.filter(no__gt=3,no__lt=10) #查询编号大于3,小于10的字段 (精准查询) Subject.objects.filter(no__ge=3,no__le=10) Subject.objects.filter(no__range=(3,10)) #查询编号3到10的字段 (精准查询,区间查询) Subject.objects.get(pk=1) Subject.objects.get(no=1) Subject.objects.get(no=1).first() Subject.objects.get(no=1).last() #查询主键为1的学科 (精准查询) Subject.objects.order_by('no') #查询所有,按编号升序 (精准查询) Subject.objects.order_by('-no') #查询所有,按编号降序 Subject.objects.order_by('no')[:3] #查询从编号从小到大前3个字段 (精准查询) Subject.objects.count() #查询数据库一共有多少条数据 (精准查询) Teacher.objects.filter(subject__no=1) Subject.objects.get(pk=1).teacher_set.all() # 查询编号为1的学科的老师 Teacher.objects.filter(subject__name__contains='全栈') # 查询学科名称有“全栈”二字的学科的老师 (模糊查询)说明1:由于老师与学科之间存在多对一外键关联,所以能通过学科反向查询到该学科的老师(从一对多关系中“一”的一方查询“多”的一方),反向查询属性默认的名字是 类名⼩写_set (如上面例子中的 teacher_set ),当然也可以在创建模型时通过 ForeingKey 的 related_name 属性指定反向查询属性的名字。如果不希望执行反向查询可以将 related_name 属性设置为 '+' 或者以 '+' 开头的字符串。说明2:ORM查询多个对象时会返回QuerySet对象,QuerySet使用了惰性查询,即在创建QuerySet对象的过程中不涉及任何数据库活动,等真正用到对象时(对QuerySet求值)才向数据库发送SQL语句并获取对应的结果,这⼀点在实际开发中需要引起注意!说明3:如果希望更新多条数据,不用先逐一获取模型对象再修改对象属性,可以直接使用QuerySet对象的 update() 方法一次性更新多条数据。查询参考按字段查找可以用的条件1. exact / iexact :精确匹配/忽略大小写的精确匹配查询2. contains / icontains / startswith / istartswith / endswith / iendswith :基于 like 的模糊查询3. in :集合运算4. gt / gte / lt / lte :大于/大于等于/小于/小于等于关系运算5. range :指定范围查询(SQL中的 between…and… )6. year / month / day / week_day / hour / minute / second :查询时间日期7. isnull :查询空值(True)或非空值(False)8. search :基于全文索引的全文检索(一般很少使⽤)9. regex / iregex :基于正则表达式的模糊匹配查询
转载地址:http://nrqh.baihongyu.com/