模型层补充
模型层补充
一、IntegerField中choices参数
在数据库中往往有一些,几个固定结果的字段,比如,姓名男女,这是就可以用choices参数,对指定字段在数据库中存储
# models.py
class Userinfo(models.Model):
username = models.CharField(max_length=30)
password = models.CharField(max_length=30)
choices = (
(1, 'male'),
(2, 'female'),
)
"""
1. 如果存在上面元组中数字会取出什么值
2. 如果存的数字不在元组范围内,会取出什么值
数字没有对应关系也可以存
"""
gender = models.IntegerField(choices=choices)
# 数据库中数据
1 randy 123 1
2 老王 324 2
3 小王 234 3
#test.py
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ajax.settings")
import django
django.setup()
from app import models
user_obj = models.Userinfo.objects.filter(pk=1).first()
print(user_obj.username)
print(user_obj.password)
# 针对choices字段,如果你想要获取数字对应的中文,你不能直接点字段
# 固定句式 数据对象.get_字段名_display() 当没有对应关系的时候,该句式获取到的还是数字
print(user_obj.get_gender_display())
randy
123
male
总结:
- 固定获取对应字段方式,数据对象.get_字段名_display()
- 获取gender值与choise对应,则获取与之对应的字段值,如果不存在则返回本身的值
- 可以存在choise没有队形的字段
例如:
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课纪录", choices=record_choices, default="checked",
score_choices = ((100, 'A+'),
(90, 'A'),
(85, 'B+'),
(80, 'B'),
(70, 'B-'),
(60, 'C+'),
(50, 'C'),
(40, 'C-'),
(0, ' D'),
(-1, 'N/A'),
(-100, 'COPY'),
(-1000, 'FAIL'),
)
score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
二、bulk_create插入数据
1.create插入数据
<body>
{% for user_obj in user_all %}
<p>{{ user_obj.username }}</p>
{% endfor %}
</body>
# urls.py
from app01 import views
urlpatterns = [
url(r'^insert/', views.insert),
]
# views.py
from app01 import models
import time
def insert(request):
start = time.time()
# 向用户插入1000条数据
for i in range(1000):
models.Userinfo.objects.create(username=f'name{i}')
end = time.time()
print(start - end)
user_all = models.Userinfo.objects.all()
return render(request, '01insert.html', locals())
消耗时间:89.44472026824951
2.bulk_create插入数据
<body>
{% for user_obj in user_all %}
<p>{{ user_obj.username }}</p>
{% endfor %}
</body>
# urls.py
from app01 import views
urlpatterns = [
url(r'^insert/', views.insert),
]
# views.py
from app01 import models
import time
def insert(request):
start = time.time()
user_list = []
# 向用户插入1000000条数据
for i in range(1000000):
user_list.append(models.Userinfo(username=f'name{1}'))
models.Userinfo.objects.bulk_create(user_list) # 批量插入数据
end = time.time()
print(end - start)
user_all = models.Userinfo.objects.all()
return render(request, '01insert.html', locals())
消耗时间:15.766580820083618
总结:
- create插入数据,效率极低,每次都要访问数据库,从而导致很慢
- bulk_crate:插入数据,效率高,相当于只访问了一次数据库
- 两者效率相差很大
三、 创建多对多表关系三种方式
方式一:自行创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
class Meta:
unique_together = ("author", "book")
方式二:通过ManyToManyField自动创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", related_name="authors")
方式三:设置ManyTomanyField并指定自行创建的第三张表
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名")
# authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))
# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
# through_fields接受一个2元组('field1','field2'):
# 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
class Author2Book(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
class Meta:
unique_together = ("author", "book")
总结:
-
自动创建第三张表
- 好处在于 django orm会自动帮你创建第三张关系表
- 坏处它只会帮你创建两个表的关系字段,不能额外的添加字段
- 创建第三张表虽然方便但是扩展性较差,不能够添加额外的字段
-
纯手动创建第三张表
- 好处在于第三张表可以任意的添加额外的字段
- 坏处在于orm查询的时候,很多方法都不支持,从而导致查询数据的时候非常的麻烦
-
半手动创建第三表
-
可以创建额外的字段
-
手动创建表,会告诉orm,第三张表是自己创建的的,orm主需要给我们提供方便的查询方法
-
虽然可以使用orm查询的方法,但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系。
-
半自动 一定要加两个额外的参数: through='Book2Author', through_fields=('book','author')
-
后面字段的顺序: 由第三张表通过哪个字段查询单表 就把哪个字段放前面
-
四、MVC框架和MTV框架
MVC框架
MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。
Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。
Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。
模型: 负责业务对象与数据库的映射(ORM),视图: 负责与用户的交互(页面),控制器: 接受用户的输入调用模型和视图完成用户的请求
Django的MTV模式
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户(html)
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template