数据库操作
- dbfirst:数据库优先
- codefirst(ORM):代码优先,sqlalchemy和DJango都是用的这种
创建表
a.在app下的models.py中,创建类
from django.db import modelsclass UserInfo(models.Model): #django会默认为我们生成一个自增且是主键的id列 uid = models.AutoField(primary_key=True) #当然也可以自己写,必须要这样写 username = models.CharField(max_length=32) # 用户名列,字符串类型,指定长度 password = models.CharField(max_length=64)
b.注册app(在settings下的INSTALLED_APPS中将app的名字添加进路径)
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01',]
c.执行命令
python manage.py makemigrationspython manage.py migrate
Django连接mysql
Django默认使用MySQLdb模块链接MySQL但MySQLdb只支持到python2.7,所以要进行以下操作
settings.pyDATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', 'USER': 'root', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', }}如下设置放置的与project同名的配置的__init__.py文件中 import pymysqlpymysql.install_as_MySQLdb()
字段
- 字符串类型
- 数字类型
- 时间类型
- 二进制类型
字段的参数
a.数据库部分
null 数据库中字段是否可以为空email = models.CharField(max_length=60,null=True)db_column 数据库中字段的列名email = models.CharField(max_length=60,db_column='e-mail')default 数据库中字段的默认值email = models.CharField(max_length=60,default='alex3714@163.com')primary_key 数据库中字段是否为主键uid = models.AutoField(primary_key=True) #AutoField 自增
db_index 数据库中字段是否可以建立索引unique 数据库中字段是否可以建立唯一索引unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引unique_for_month 数据库中字段【月】部分是否可以建立唯一索引unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
auto_now 创建时自动生成当前时间uptime = models.DateTimeField(auto_now=True, null=True)auto_now_add 更新时,自动更新为当前时间ctime = models.DateTimeField(auto_now_add=True, null=True)obj = UserGroup.objects.filter(id=1).update(caption='CEO') #使用这种方式更新时不能记录obj = UserGroup.objects.filter(id=1).first()obj.caption = "CEO"obj.save()
b.admin/modelform部分
verbose_name Admin中显示的字段名称blank Admin中是否允许用户输入为空editable Admin中是否可以编辑help_text Admin中该字段的提示信息choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)error_messages 先pass,自定义错误信息(字典类型),从而定制想要显示的错误信息; 字典键:null, blank, invalid, invalid_choice, unique, and unique_for_date 如:{'null': "不能为空.", 'invalid': '格式错误'}validators pass #小tips:数据库中的EmailField,URLFiled等是给admin用的
1 from django.db import models 2 3 # Create your models here. 4 5 class UserInfo(models.Model): 6 username = models.CharField(max_length=32, verbose_name='用户名') # 用户名列,字符串类型,指定长度 7 password = models.CharField(max_length=60, help_text='pwd') 8 email = models.CharField(max_length=60,null=True,blank=True) 9 test = models.EmailField(max_length=19, null=True)10 text = models.CharField(max_length=20,null=True,editable=False)
2、根据类对数据库表中的数据进行各种操作
对数据库的增、删、改、查
views.pyfrom cmdb import modelsdef orm(request): #增,建议用前两种 models.UserInfo.objects.create(username='root',password='123') dic={'username':'alex','password':'321'} models.UserInfo.objects.create(**dic) obj = models.UserInfo(username='x54256',password='666') obj.save() #查,filter<==>where查询条件 result = models.UserInfo.objects.all() #拿到所有的 #Query[obj1(uid,username,password),obj2(uid,username,password),obj3(uid,username,password)] for i in result: print(i.uid,i.username,i.password) result = models.UserInfo.objects.filter(username='root') for item in result: print(item.uid,item.username,item.password) #小tips:result.query==>查看当前sql语句 result = models.UserInfo.objects.filter(username='root',password='123').first() #直接取得就是Query对象 print(result.uid,...) #删 models.UserInfo.objects.filter(username='root').delete() #改 models.UserInfo.objects.filter(id=3).update(password=147) return HttpResponse('abc')
5种查询方法(元组,字典方法)
v1 = models.Host.objects.all()# QuerySet[obj(id,hostname),obj,...],内部元素都是对象v2 = models.Host.objects.all().values('hostname','ip','port','b_id','b__caption') #b连接的外键 在元组和字典格式里跨表查询时要用"__"# QuerySet[{'hostname':c1,'ip':1.1.1.1,'port':80,'b_id':2,'b__caption':abc},{},...],内部元素都是字典v3 = models.Host.objects.all().values_list('hostname', 'ip', 'port', 'b__caption')# QuerySet[(c1,1.1.1.1,80,2,abc),(),...],内部元素都是元组models.Business.objects.get(id=1) # 获取到的一个对象,如果不存在就报错获取到一个对象或者None : models.Business.objects.filter(id=1).first() #***建议用这种return render(request,'host.html',{'v1':v1,'v2':v2,'v3':v3,'b_list':b_list})
1 2 3 4 5Title 6 7 8业务线列表(对象)
9
- 10 {% for i in v1 %}11
- { { i.id }}-{ { i.caption }}-{ { i.code }} 12 {% endfor %}13
业务线列表(字典)
15- 16 {% for i in v2 %}17
- { { i.id }}-{ { i.caption }} 18 {% endfor %}19
业务线列表(元组)
21- 22 {% for i in v3 %}23
- { { i.0 }}-{ { i.1 }} 24 {% endfor %}25
一对多(绑外键)
from django.db import models# Create your models here.class UserInfo(models.Model): uid = models.AutoField(primary_key=True) username = models.CharField(max_length=32, verbose_name='用户名') # 用户名列,字符串类型,指定长度 password = models.CharField(max_length=60, help_text='pwd') email = models.CharField(max_length=60,null=True) user_group = models.ForeignKey("UserGroup", to_field='id') #绑定UserGroup的id列(绑定的列必须每一行都是唯一的,不写to_field的默认绑主键)class UserGroup(models.Model): caption = models.CharField(max_length=32) ctime = models.DateTimeField(auto_now_add=True, null=True) uptime = models.DateTimeField(auto_now=True, null=True) user_type_choices = ( # 内存中存放 (1, '超级用户'), (2, '普通用户'), (3, '普普通用户'), ) user_type_id = models.IntegerField(choices=user_type_choices,default=1) #默认值是1
Django默认为我们生成了一个user_group_id代表着外键连接的表的id
def orm(request): result = models.UserInfo.objects.all() # 拿到所有的 # Query[obj1(uid,username,password,email,user_group_id),obj2(...),obj3(...)] for i in result: #i.user_group_id==>所绑的id #i.user_group==>是绑定的那个飚的对象,so可以用i.user_group.另一个表的内容 print(i.id,i.user_group_id,i.user_group.caption)
小Tips:
数据库中的EmailField,URLFiled等是给admin用的
result.query==>查看当前sql语句(result是Query对象)
default=1 ==> #默认值是1
多对多
方式一:自定义关系表(直接创建第3张表,想有多长就有多长)***
class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id')class Application(models.Model): name = models.CharField(max_length=32)class HostToApp(models.Model): hobj = models.ForeignKey(to='Host',to_field='nid') aobj = models.ForeignKey(to='Application',to_field='id')#可以直接对第三张表进行操作#增HostToApp.objects.create(hobj_id=1,aobj_id=2)
方式二:自动创建关系表
class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id')class Application(models.Model): name = models.CharField(max_length=32) r = models.ManyToManyField("Host") #无法直接对第三张表进行操作#但我们可以间接操作第三张表呀obj = Application.objects.get(id=1)obj.nameobj.r.add(2) #在id=1下添加id=2obj.r.add(*[1,2,3,4]) #在id=1下添加id=1,2,3,4obj.r.remove(2) #删除id=1下的id=2obj.r.remove(*[1,2,3]) #添加删除列表 要加*obj.r.clear() #删除所有id=1的obj.r.set([3,5,7]) #删除所有id=1的,添加1 3,1 5,1 7 而且不加*obj.r.all() # 所有相关的主机对象QuerySet"列表" ,(一开始我也是不信的)
1 def cla_stu_add(request): 2 3 class_name = request.POST.get('class_name') 4 student_list = request.POST.getlist('student_list') 5 6 obj = models.classes.objects.create(name=class_name) 7 obj.r.add(*student_list) 8 9 return redirect('/cmdb/classes')10 11 12 def cla_stu_edit(request):13 14 pass
1 2 3 4 558 59Title 6 32 33 34 35 46 47 48
课程名 | 学生列表 | 63|
---|---|---|
{ { row.name }} | 6970 {% for i in row.r.all %}71 { { i.stu_name }}72 {% endfor %}73 | 74编辑|删除 | 75