Django Model基础 ORM
ORM
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。
Django中的映射关系:
1 2 3 4 5 | 表名<------>类名 字段<------>属性 表记录<----->类实例对象 |
创建表(建立模型)
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 | from django.db import models analyse = ''' 分析: 一本书 可以由多个作者编著 一本书只能由一个出版社出版 一个作者可以写多本书 每个作者有自己的简介 对应关系: Author-Book --> 多对多 Publish-Book --> 一对多 Author-AuhtorDetail --> 一对一 如何创建: 多对多:ManyToManyField 一对多:ForeignKey 一对一:OneToOneField 创建一对多表的时候,ForeignKey建在多的那一方。另外两个随意建在哪一方。 ''' class Publish(models.Model): # 出版社 nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32) email = models.EmailField() class Author(models.Model): # 作者 name = models.CharField(max_length=32) age = models.IntegerField() class AuhtorDetail(models.Model): # 作者简介 addr = models.CharField(max_length=32) email = models.EmailField() author = models.OneToOneField('Author') class Book(models.Model): # 书籍 title = models.CharField(max_length=32) publishDate = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) # 最大 999.99 publish = models.ForeignKey('Publish') # 一对多 authors = models.ManyToManyField('Author') # 多对多 |
注意:建立一对多的关系时,外键字段建立在多的一方。建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
当创建好model.py里面的类(也就是数据库中对应的表)之后,还需要输入以下两条命令来生成并更新表:
python manage.py makemigrations
python manage.py migrate
上面的命令执行成功后,表就创建出来了,此时表中还没有添加记录。
这些类实例化出来的对象就是对应数据库表中的一条记录。
通过配置settings.py文件的logging可以查看ORM操作运用的sql语句(下面的代码粘贴到settings.py里就行)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | LOGGING = { 'version' : 1 , 'disable_existing_loggers' : False , 'handlers' : { 'console' :{ 'level' : 'DEBUG' , 'class' : 'logging.StreamHandler' , }, }, 'loggers' : { 'django.db.backends' : { 'handlers' : [ 'console' ], 'propagate' : True , 'level' : 'DEBUG' , }, } } |
字段选项
每个字段有一些特有的参数,例如,CharField需要max_length参数来指定VARCHAR数据库字段的大小。
常用通用参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | null 如果为 True ,Django 将用NULL 来在数据库中存储空值。 默认值是 False . blank 如果为 True ,该字段允许不填。默认为 False 。 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。 如果一个字段的blank = True ,表单的验证将允许该字段是空值。如果字段的blank = False ,该字段就是必填的。 default 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。 primary_key 如果为 True ,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key = True , Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为, 否则没必要设置任何一个字段的primary_key = True 。 unique 如果该值设置为 True , 这个数据字段的值在整张表中必须是唯一的 |
更多详见模型字段参考
添加表记录
普通字段
1 2 3 4 5 6 7 8 9 10 | # 方式1 publish_obj = Publish(name = "人民出版社" ,city = "北京" ,email = "renMin@163.com" ) publish_obj.save() # 将数据保存到数据库 # 方式2 (也可以接收到一个返回值,是添加的记录对象) Publish.objects.create(name = "人民出版社" ,city = "北京" ,email = "renMin@163.com" ) # # 方式3(了解,慎用,因为request里面还可能有表之外的其他内容) Publish.objects.create( * * request.POST. dict ()) |
......
查询表记录
查询相关API
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 | all (): 查询所有结果 filter ( * * kwargs): 它包含了与所给筛选条件相匹配的对象 get( * * kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 exclude( * * kwargs): 它包含了与所给筛选条件不匹配的对象 values( * field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 values_list( * field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 order_by( * field): 对查询结果排序 reverse(): 对查询结果反向排序 distinct(): 从返回结果中剔除重复纪录 count(): 返回数据库中匹配查询(QuerySet)的对象数量。 first(): 返回第一条记录 last(): 返回最后一条记录 exists(): 优化查询,如果QuerySet包含数据,就返回 True ,否则返回 False |
双下划线之单表查询
1 2 3 4 5 6 7 8 9 10 11 | models.Tb1.objects. filter (id__gt = 1 , id__lt = 10 ) # 获取id大于1 且 小于10的值 models.Tb1.objects. filter (id__in = [ 11 , 22 , 33 ]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in = [ 11 , 22 , 33 ]) # not in models.Tb1.objects. filter (name__contains = "ven" ) # 模糊查询类似mysql中的%like% models.Tb1.objects. filter (name__icontains = "ven" ) # icontains大小写不敏感 models.Tb1.objects. filter (id__range = [ 1 , 2 ]) # 范围bettwen and,包含1跟2 startswith,istartswith, endswith, iendswith |
......
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了