Django——model(建表,增删改查,外键,多对多)

数据库操作

  • dbfirst:数据库优先
  • codefirst(ORM):代码优先,sqlalchemy和DJango都是用的这种

创建表

a.在app下的models.py中,创建类

from django.db import models

class 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  makemigrations

python manage.py  migrate

Django——model(建表,增删改查,外键,多对多)_第1张图片

Django——model(建表,增删改查,外键,多对多)_第2张图片

Django连接mysql

Django默认使用MySQLdb模块链接MySQL但MySQLdb只支持到python2.7,所以要进行以下操作

settings.py

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}


如下设置放置的与project同名的配置的__init__.py文件中
  
import pymysql
pymysql.install_as_MySQLdb() 

Django——model(建表,增删改查,外键,多对多)_第3张图片

 

Django——model(建表,增删改查,外键,多对多)_第4张图片  

 字段

  • 字符串类型
  • 数字类型
  • 时间类型
  • 二进制类型

字段的参数

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='[email protected]')

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部分

Django——model(建表,增删改查,外键,多对多)_第5张图片

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用的

Django——model(建表,增删改查,外键,多对多)_第6张图片

 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.py

from cmdb import models

def 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 DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Titletitle>
 6 head>
 7 <body>
 8     <h1>业务线列表(对象)h1>
 9     <ul>
10         {% for i in v1 %}
11             <li>{{ i.id }}-{{ i.caption }}-{{ i.code }}li>
12         {% endfor %}
13     ul>
14     <h1>业务线列表(字典)h1>
15     <ul>
16         {% for i in v2 %}
17             <li>{{ i.id }}-{{ i.caption }}li>
18         {% endfor %}
19     ul>
20     <h1>业务线列表(元组)h1>
21     <ul>
22         {% for i in v3 %}
23             <li>{{ i.0 }}-{{ i.1 }}li>
24         {% endfor %}
25     ul>
26 
27 
28 body>
29 html>
对象、元组、字典(前端)

一对多(绑外键)

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.name


obj.r.add(2)    #在id=1下添加id=2

obj.r.add(*[1,2,3,4])    #在id=1下添加id=1,2,3,4

obj.r.remove(2)    #删除id=1下的id=2

obj.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 DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Titletitle>
 6     <style>
 7     .hide{
 8             display: none;
 9         }
10         .shade{
11             position: fixed;
12             top: 0;
13             right: 0;
14             left: 0;
15             bottom: 0;
16             background: black;
17             opacity: 0.6;
18             z-index: 100;
19         }
20         .add-modal,.delete{
21             position: fixed;
22             height: 300px;
23             width: 400px;
24             top:100px;
25             left: 50%;
26             z-index: 101;
27             border: 1px solid red;
28             background: white;
29             margin-left: -200px;
30         }
31         style>
32 head>
33 <body>
34     <div class="shade hide">div>
35     <div class="add-modal hide">
36         <form class="form_edit" method="post" action="/cmdb/cla_stu_edit/">
37             <p><input type="text" id="stu_name" name="stu_name" placeholder="学生姓名" /><span style="color: red">*span>p>
38 
39             <p><select  name="cla_stu_edit" id="cla_stu_edit" multiple   >
40                 {% for i in student_list %}
41                     <option value="{{ i.sid }}">{{ i.stu_name }}option>
42                 {% endfor %}select>p>
43             <input id="i2" type="submit" value="确认" />
44         form>
45     div>
46 
47 
48     <form action="/cmdb/cla_stu_add/" method="post">
49         <input type="text" placeholder="课程名" name="class_name" />
50         <select name="student_list" multiple>
51             {% for i in student_list %}
52                 <option value="{{ i.sid }}">{{ i.stu_name }}option>
53             {% endfor %}
54         select>
55         <input type="submit" value="添加"/>
56 
57     form>
58 
59     <table border="1">
60         <thead>
61             <tr>
62                 <th>课程名th><th>学生列表th>
63             tr>
64         thead>
65         <tbody>
66             {% for row in classes_list %}
67                 <tr>
68                     <td rid="{{ row.id }}">{{ row.name }}td>
69                     <td>
70                         {% for i in row.r.all %}
71                             <span sid="{{ i.sid }}">{{ i.stu_name }}span>
72                         {% endfor %}
73                     td>
74                     <td><a class="edit">编辑a>|<a>删除a>td>
75                 tr>
76             {% endfor %}
77         tbody>
78     table>
79     <script src="/static/jquery-1.12.4.js">script>
80     <script>
81         $(".edit").click(function () {
82             var sid_list = [];
83             $(this).parent().prev().each(function () {
84                 var sid = $(this).attr('sid');
85                 sid_list.push(sid)
86             });
87             $('#cla_stu_edit').val(sid_list);
88 
89             $('.hide').removeClass('hide')
90 
91         })
92     script>
93 body>
94 html>
html端

 

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

你可能感兴趣的:(Django——model(建表,增删改查,外键,多对多))