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里就行)

字段选项

每个字段有一些特有的参数,例如,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 

  ......

  

posted @   0bug  阅读(196)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示