Django(五)、ORM基础

前言
在Python中,最知名的ORM非SQLAlchemy莫属了,同时,Django作为一款功能丰富的框架,其中也内置了专属的ORM,其语法逻辑与SQLAlchemy十分相似,有过SQLAlchemy使用经验的可以很容易上手。SQLAlchemy基础使用参考:Python ORM :SQLAlchemy基础使用

一、常用字段类型

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

AutoField(Field)
- int自增列,必须填入参数 primary_key=True

BigAutoField(AutoField)
- bigint自增列,必须填入参数 primary_key=True
-
SmallIntegerField(IntegerField):
- 小整数 -3276832767

PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整数 032767
IntegerField(Field)
- 整数列(有符号的) -21474836482147483647

PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整数 02147483647

BigIntegerField(IntegerField):
- 长整型(有符号的) -92233720368547758089223372036854775807

BooleanField(Field)
- 布尔值类型

NullBooleanField(Field):
- 可以为空的布尔值

CharField(Field)
- 字符类型
- 必须提供max_length参数, max_length表示字符长度

TextField(Field)
- 文本类型

FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage

ImageField(FileField)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串)

DateTimeField(DateField)
- 期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
- 期格式 YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
- 时间格式 HH:MM[:ss[.uuuuuu]]

DurationField(Field)
- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

FloatField(Field)
- 浮点型

DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度

BinaryField(Field)
- 二进制类型

二、常见字段参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

null 数据库中字段是否可以为空
db_column 数据库中字段的列名
db_tablespace
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否唯一
unique_for_date 数据库中字段【期】部分是否唯一
unique_for_month 数据库中字段【/】部分是否唯一
unique_for_year 数据库中字段【/】部分是否唯一
注意:当uniqueTrue时,你不需要再指定db_index创建索引,因为unique暗示创建索引

verbose_name Admin中显示的字段名称
blank Admin中是否允许用户输入为空
editable Admin中是否可以编辑
help_text Admin中该字段的提示信息
choices Admin中显示选择框的内容,较少且几乎不变动的数据,可以将其放在程序内存
中,不用单独创建一张表从而避免跨表操作
如:type = models.IntegerField(choices=[(0, 'man'),(1, 'woman'),],default=1)

三、表结构创建
在django程序子目录或主目录创建models.py文件,在该文件内定义表结构,比如创建一个主机表,创建方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from django.db import models

# Create your models here.

class Host(models.Model):
id = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=16,db_index=True)
host_ip = models.GenericIPAddressField(db_index=True)
owner_name=models.CharField(max_length=16)
owner_id = models.CharField(max_length=16)
asset_tag=models.CharField(max_length=16)
online_time=models.DateField(default=None)
OS = models.CharField(max_length=16)
OS_type=models.CharField(max_length=16)
off_time=models.DateField(default=None)
SN=models.CharField(max_length=32)
Brand=models.CharField(max_length=8)
memory=models.SmallIntegerField(default=None)
CPU_num=models.IntegerField(default=None)

cmd输入:

1
2
python manage.py makemigrations   #检测表结构变化
python manage.py migrate #表结构构建

django默认使用的是自带的sqlite,使用Navicat连接此sqlite路径,登录查看表结构:
这里写图片描述
这里写图片描述

四、增删改查
在前端写几个简单的增删改查的表格,往后端提交数据,后端在同级目录views.py中引入model.py对前端请求进行处理:

后端views.py:

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
from cmdb import models

#增
def addhost(request):
ref=request.META.get('HTTP_REFERER') #获取request referer来源url
print(request.POST)
if request.method == "POST":
#方式一:
#obj=models.Host(hostname='',host_ip='xxx',...)
#obj.save()

#方式二:
#models.Host.objects.create(hostname="xxx",host_ip='xxx',...) #直接加,各字段直接传参,推荐使用


#方式三:各字段名作key,值作value,构建一个dict,使用models.Host.objects.create(**dict)的方式创建,推荐字段较多时使用。

obj_info={
'hostname' : request.POST.get("hostname"),
'host_ip' : request.POST.get("host_ip"),
'owner_name' : request.POST.get("owner_name"),
'owner_id' : request.POST.get("owner_id"),
'asset_tag' : request.POST.get("asset_tag"),
'online_time' : request.POST.get("online_time"),
'OS' : request.POST.get("OS"),
'OS_type' : request.POST.get("OS_type"),
'off_time' : request.POST.get("off_time"),
'SN' : request.POST.get("SN"),
'brand' : request.POST.get("brand"),
'memory' : int(request.POST.get("mem")),
'CPU_num' : int(request.POST.get("CPU_num")),
}
models.Host.objects.create(**obj_info)

return redirect(ref)

#查
def search(request):
if request.method=="GET":
Owner=request.GET.get('Owner',None)
print(Owner)
sear_res=models.Host.objects.filter(owner_name=Owner)
print(sear_res) #查询出来的结果是一个queryset集合的格式,当做list格式理解

return render(request,'cmdb_index.html',{"search_result":sear_res})

#删
def delete(request):
ref=request.META.get('HTTP_REFERER') #获取request referer来源url
nid=int(request.POST.get('nid'))

models.Host.objects.filter(id=nid).delete() #query then delete

return redirect(ref)


#改
def modify(request):
res={"status":True,"error":False,"data":None}
ref=request.META.get('HTTP_REFERER') #获取request referer来源url

if request.method=='POST':
try:
obj_info={
'hostname' : request.POST.get("hostname"),
'host_ip' : request.POST.get("host_ip"),
'owner_name' : request.POST.get("owner_name"),
'owner_id' : request.POST.get("owner_id"),
'asset_tag' : request.POST.get("asset_tag"),
'online_time' : request.POST.get("online_time"),
'OS' : request.POST.get("OS"),
'OS_type' : request.POST.get("OS_type"),
'off_time' : request.POST.get("off_time"),
'SN' : request.POST.get("SN"),
'Brand' : request.POST.get("Brand"),
'memory' : int(request.POST.get("memory")),
'CPU_num' : int(request.POST.get("CPU_num")),
}
nid=request.POST.get('Asset_ID')
models.Host.objects.filter(id=int(nid)).update(**obj_info) #查询然后更新,即修改

except Exception as e:
res['error']=e
res['status']=False

return HttpResponse(json.dumps(res))

前端代码就不贴了,涉及到一些ajax的操作,后面再整理一下ajax的基本操作.

赏一瓶快乐回宅水吧~
-------------本文结束感谢您的阅读-------------