博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django——model(建表,增删改查,外键,多对多)
阅读量:5030 次
发布时间:2019-06-12

本文共 9312 字,大约阅读时间需要 31 分钟。

数据库操作

  • 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)
View Code

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     
5 Title 6 7 8

业务线列表(对象)

9
    10 {% for i in v1 %}11
  • {
    { i.id }}-{
    { i.caption }}-{
    { i.code }}
  • 12 {% endfor %}13
14

业务线列表(字典)

15
    16 {% for i in v2 %}17
  • {
    { i.id }}-{
    { i.caption }}
  • 18 {% endfor %}19
20

业务线列表(元组)

21
    22 {% for i in v3 %}23
  • {
    { i.0 }}-{
    { i.1 }}
  • 24 {% endfor %}25
26 27 28 29
对象、元组、字典(前端)

一对多(绑外键)

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
views.py
1  2  3  4     
5 Title 6 32 33 34
35
36
37

*

38 39

43
44
45
46 47 48
49
50
55
56 57
58 59
60
61
62
63
64
65
66 {% for row in classes_list %}67
68
69
74
75
76 {% endfor %}77
78
课程名 学生列表
{
{ row.name }}
70 {% for i in row.r.all %}71 {
{ i.stu_name }}
72 {% endfor %}73
编辑|删除
79 80 93 94
html端

 

转载于:https://www.cnblogs.com/x54256/p/7801407.html

你可能感兴趣的文章
CI 框架中的日志处理 以及 404异常处理
查看>>
keepalived介绍
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>
rxjs一句话描述一个操作符(1)
查看>>
第一次独立上手多线程高并发的项目的心路历程
查看>>
ServiceStack 介绍
查看>>
Centos7下载和安装教程
查看>>