Django(五)、ORM基础
程序员文章站
2022-04-16 10:33:04
...
前言
在Python中,最知名的ORM非SQLAlchemy莫属了,同时,Django作为一款功能丰富的框架,其中也内置了专属的ORM,其语法逻辑与SQLAlchemy十分相似,有过SQLAlchemy使用经验的可以很容易上手。SQLAlchemy基础使用参考:Python ORM :SQLAlchemy基础使用
一、常用字段类型
AutoField(Field)
- int自增列,必须填入参数 primary_key=True
BigAutoField(AutoField)
- bigint自增列,必须填入参数 primary_key=True
-
SmallIntegerField(IntegerField):
- 小整数 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整数 0 ~ 32767
IntegerField(Field)
- 整数列(有符号的) -2147483648 ~ 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整数 0 ~ 2147483647
BigIntegerField(IntegerField):
- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
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)
- 二进制类型
二、常见字段参数
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
db_tablespace
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否唯一
unique_for_date 数据库中字段【日期】部分是否唯一
unique_for_month 数据库中字段【月】部分是否唯一
unique_for_year 数据库中字段【年】部分是否唯一
注意:当unique 为 True时,你不需要再指定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文件,在该文件内定义表结构,比如创建一个主机表,创建方式如下:
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输入:
python manage.py makemigrations #检测表结构变化
python manage.py migrate #表结构构建
django默认使用的是自带的sqlite,使用Navicat连接此sqlite路径,登录查看表结构:
四、增删改查
在前端写几个简单的增删改查的表格,往后端提交数据,后端在同级目录views.py中引入model.py对前端请求进行处理:
后端views.py:
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的基本操作.