Django (二) 常用字段及 ORM
2016-09-29 16:05 dribs 阅读(3409) 评论(1) 编辑 收藏 举报MVC介绍 Django生命周期 many-to-many One-to-many Django常用字段 CharFiled 需要有max_length unique=True(代表不能重名) EmailFiled URLField ManyToManyField(哪个表) #多对多的关系 ForeignKey(哪个表) #一对多的关系 DateTimeField #精确到秒或者分 DateField #精确到天 == DurationField DecimalField #小数 FloatField SmallIntegrField TextField TimeField =======常用的属性=== unique null=True 数据库那里可以为空,默认不能为空。数据库可以为空,前端不行。加上blank=True blank=True 前端那里可以为空,限制的是Django admin verbose_name=u'中文傻傻' #把字段在前端用中文显示 choices db_index #给字段做索引(不常用) editable=False #Django前端页面某项不能修改,消失了。。。。 error_messages help_text="help.....dddddd....." #前端告诉用户怎么填,地下出现写的提示 ========= 一个表对应一个类 class Author(models.Model): #作者表 first_name = models.CharFiled(max_length=32,unique=True) last_name = models.CharFiled(max_length=32) class Meta: verbose_name_plural = u'作者' #在Django中的前端把表名用中文显示 def __unicode__(self): #py3.0的是 __str__ return 'xxxx' ====== python manager.py migrate makemigrations #做检查生成SQL语句 migrate #执行 ========== 前端admin默认不出现准确字段,(出现的是XXX object, 如果想看到显示的具体是什么,需要在类下写 def __unicode__(self): #py3.0的是 __str__ return "" ========================================================================= 上面用了Django的admin对数据库进行操作,下面是常用命令的方式 导入models模块 默认不配置环境变量是不能导入的,可以用调试模式,如下 python manager.py shell #进入调试模式 from app01 import models models.Author.objects.all() #查找所有 last() #查找最后 修改: 先找到,在修改 改完保存 a1 = models.Author.objects.last() a1.last_name = "xxxxx" a1.save() 创建 new_author_obj = models.Author(first_name="NewNname",last_name="NewLastName") new_author_obj.save() 第二种创建方式不用在保存一次 直接会保存 new_author_obj = models.Author.objects.create(first_name="NewNname2",last_name="2NewLastName") 过滤 models.Author.objects.filter(last_name="NewLastNname",first_name="NewNname") 模糊过滤 两个下划线 __contains 大小写忽略 __icontains id__range=[2,4] 取id的 models.Author.objects.filter(last_name__contains="NewLastNname") 批量修改 .update models.Author.objects.filter(last_name__icontains="NewLastNname").update(last_name=“hhh”) 连锁查询 order_by 查询书有多少个作者 b1 = models.Book.objects.last() b1.authors 这个时候返回出现的是一个对象,类似于<xxxxx object at xxxxx>,如果想正常显示,需要加select_related() b1.authors.select_related() 删除 b1.deleted()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | Django forms http: / / www.cnblogs.com / BeginMan / archive / 2013 / 09 / 06 / 3306081.html 1 、特点 django forms是Django的表单处理库。依赖HttpRequest,它具有如下特点: ( 1 )、快速自动生成HTML表单 ( 2 )、表单数据校验 ( 3 )、错误信息提示 ( 4 )、自动转换为python数据格式 Django中的Form一般有两种功能 1 、输入HTML,自动生成前端表单 2 、验证用户输入,验证输入的合法性 使用 1 :单独创建一个forms文件, from django import forms class BookForm(forms.Form): name = forms.CharField(max_length = 10 ) ...... 2 :在views里把创建的forms返回给前端, form.is_valid 验证数据 form.cleaned_data 获取干净的数据 去掉html那些没用的 from app01 import forms def book_form(request): form = forms.BookForm() #生成实例 return render(request, 'app01/book_form.html' , { 'book_form' :form }) 3 :然后前端调用 book_form,单独取一个值,就是{{book_form.name}} {{book_form}} 具体事例 <form action = " " method=" post">{ % csrf_token % } #建立form表单 做提交用 和 Ajax差不多 {{book_form}} < input type = "submit" value = "创建" > < / form> Blog和Entry有外键关联 一对多的反向查询 class Blog: pass class Entry: blog = modles.ForeignKey(Blog) 通过Entry获取Blog name 为XXX的字段 models.Entry.objects.get(blog__name = "xxxx" ) 另一种反向关联查询)跟这个出版社相关的书都查出来 class Publiser(models.Models): pass class Book(models.Models): publiser = models.ForeignKey(Publiser) pub_obj = models.Publiser.objects.last() print (pub_obj.book_set.select_related()) 查询某个字段的值小与某某个字段的值 ORM F语句 >>> from django.db.models import F >>> Entry.objects. filter (n_comments__gt = F( 'n_pingbacks' )) ORM Q语句 满足第一个 and 满足第二个,满足第二个的第一个或第二个 Poll.objects.get( Q(question__startswith = 'Who' ), Q(pub_date = date( 2005 , 5 , 2 )) | Q(pub_date = date( 2005 , 5 , 6 )) ) 统一自增 models.Entry.objects.update(n_pingbacks = F( 'n_pingbacks' ) + 1 ) 表内分类聚合 values_list annotate分类统计(分类统计各项资产服务器、网络设备各有多少台) models.Book.objects.values_list( 'publish_date' ).annotate(Count( 'publish_date' )) OneToOneField和ForeignKey的区别 一对一和一对多 Djanog admin内显示中文 class Meta: verbose_name = u '班级列表' verbose_name_plural = u '班级列表' #复数形式 unqiue_together = ( 'course' , 'course_type' , 'semester' ) #联合为一 在自己的脚本里调用 Django models 加上环境变量就ok了 import os os.environ[ 'DJANGO_SETTINGS_MODULE' ] = 's12day16.settiongs' #s12day16 是你的setting所在的项目名 import django django.setup() form blog import models entry = models.Entry.objects.get(pk = 1 ) print (entry) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | Django用户认证系统 扩展 Django用户认证系统 先继承 在扩展 from django.contrib.auth.models import User class UserProfile(models.Model): user = models.OneToOneField(User) #通过一对一的方式 引用 Django的用户认证系统,然后下面的去扩展name school...... name = models.CharField(max_length = 64 ) school = models.ForeignKey( 'School' ) Django中构建表结构 自己关联自己,见例子第一个视频 35 分钟处。 models.ForeignKey( 'self' ,blank = True ,null = true) #自己的这个表还没创建,所以就要用引号括起来 让字段在admin上显示中文 verbose_name = u '汉字' consultant = models.ForeignKey( 'UserProfile' ,verbose_name = u '汉字' ) 或者 date = models.DateField(u '汉字' ,auto_now_add = True ) #把u‘汉字’放到前面 Django中引用Bootstrap 1 修改url,在主的URL下的跳转到单独项目上自己控制 url(r '^crm/' , include( 'crm.urls' ) 2 子项目里添加url文件,定义views文件的逻辑关系 url(r '^$' ,views,dashboard) 新建statics目录,下载Bootstrap添加进去 3 修改 settings文件,添加如下: STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static" ) #'/var/www/static/' #可以写很多个从第一个开始找,直到最后 ] 4 前端文件 引用 / static / bootstrap / css / .... static而不是statics 这样就无需关系 statics目录修改后在去找前端一个个的修改 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具