django Model模型二及Model模型对数据库的操作
在django模型中负责与数据库交互的为Model层,Model层提供了一个基于orm的交互框架
一:创建一个最基本的Model
from __future__ import unicode_literals
from django.db import models
import time
from Model.usertype import usersType
class userInfo(models.Model):
username=models.CharField(max_length=100)
passwd=models.CharField(max_length=20)
sex=models.BooleanField()
以上代码将创建一个最基本的Model模型,userinfo类名称实际性对应的为数据库中表的名称,具体的名称将由django自动生成相应的表名称,如:web_userinfo表名,通常是由app的名称+类名组成表名,所以app一定要注册到工程中才可以生成相应的表名及相关字段
同时,如果在Model中没有显式指定一个主键,django将生成一个默认的数值型的自增长id主键
同时在创建model是可以给字段指定默认值
如:gender=models.BooleanField(default=false)
将以上model类同步到数据库中生成相应的表后,如果需要对表建立外键时可以做以下设置:
class userInfo(models.Model):
username=models.CharField(max_length=100)
passwd=models.CharField(max_length=20)
sex=models.BooleanField()
typeId=models.ForeignKey('usersType')
class usersType(models.Model):
username=models.CharField(max_length=50)
job=models.CharField(max_length=20)
通过以上设置后即对两个Model中建立外键关系,即从userType到userinfo产生一对多的对应关系
当需要建立多对多的关系的时候通常有两种做法,一种是基于django特性的,另一种是非基于django特性的,但是两者的本质相同,都是通过中间表来实现最终目的
非django特性的即在两个Model之后再建立一个Model实体,在另外的两个实体中与其建立外键关系,显式的构建中间表来处理
基于django特性的即通过ManyToManyField来隐式构建中间表处理此类问题
针对django特性的范例代码如下:
class Group(models.Model):
Name=models.CharField(max_length=50)
class user(models.Model):
Name=models.CharField(max_length=100)
email=models.EmailField()
rel_group=models.ManyToManyField('Group')
在运行数据库的同步命令后以上代码将在数据中建立三张表,其中一张中间表将自动建立
更多的字段参数:
class Args(Models.model):
name:models.CharField(max_length=20,null=True) 允许为空
class Asset(Models.model):
createdate=Models.DateTimeField(auto_now_add=true) 创建后django将自动维护该字段数据
updatetime=Models.DateTimeField(auto_now=True)
auto_now_add=True代表该字段所在行的数据建立时更新该字段
updatetime=Models.DateTimeField(auto_now=True) 代表数据更新时自动更新
django中数据库的操作:
数据库的底层操作借助继承自django框架的已封装至mode层,但是对这些操作的调用通常在view层实现,在mtv框架中view层相当于mvc的controller负责视图与实体之间桥梁工作
以web的App为例,view层的代码如下:
Create:
def add(request,hostname):
try:
Asset.objects.create(hostname=hostname)
return HttpResponse('ok')
except Exception as err:
return HttpResponse(err)
以上代码即实现了对数据库写入一条数据的目的
由于实体继承自Model,而django的Model对数据的操作封装在了实体的objects下,所以对数据的操作应该是Model类名.objects.操作方法( Asset.objects.create(hostname=hostname))
在以上方法中,request参数为必选项,代表了当前请求的上下文内容,第二个参数为hostname,代表从url中传递到方法中的参数,即相当于http://127.0.0.1/web/add/hp,hp即对应hostname
然后需要在urls.py中配置相应的路由映射
如:url(r'^add/(?P<hostname>\w*)/$',add),
运行访问:http://127.0.0.1:8000/web/add/ibm
页面返回"ok"没有报错内容时查看数据库是否已经写入内容,如果输出ok时却没有发生异常,数据写入已完成
Remove:
def delete(request,id):
try:
obj=Asset.objects.get(id=id)
if obj:
obj.delete()
return HttpResponse('操作成功')
else:
return HttpResponse('不存在指定id')
except Exception as err:
return HttpResponse(err)
配置相应的url映射如下:
url(r'^del/(?P<id>\d*)/$',delete),
访问url http://127.0.0.1/web/del/1无异常后查看数据库变化
Update:
def update(request,id,name):
'''
更新
:param request:
:param id:
:param name:
:return:
'''
try:
obj=Asset.objects.get(id=id)
obj.hostname=name
obj.save()
return HttpResponse('ok')
except Exception as err:
return HttpResponse(err)
配置Url映射:
url(r'^update/(?P<id>\d*)/(?P<name>\w*)/$',update),
访问http://127.0.0.1/web/update/1/jay后查看数据库内容
Query:
def query(request,name):
Asset.objects.filter(hostname__contains=name)
return HttpResponse('ok')
以上为模乎查询相当于sql中的likem
对于数据的查询还有一种方法就是使用get,在update时已经使用过,如下:
obj=Asset.objects.get(id=id)
使用filter与使用get的区别就是使用get时返回音箱数据直接对应实体模型,但昌所查询的数据如果在数据库中不存在是将报借,但是使用filter返回的是django封装的queryset类型的数据
其它:
排序:
all_data=Asset.objects.all().order_by("-id") //desc
all_data=Asset.objects.all().order_by("id") //asc
取前N条记录:
alldata=Asset.objects.All()[0:2]
查询指定指定字段的值
data=Asset.objects.all().values("id","hostname",.....)
原始SQL查询
django会自动创建连结与释放游标
创建游标:
cursor=connection.cursor
cursor.execute("sql语句")
row=cursor.fetchone()