模型层补充

模型层补充

一、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

总结:

  1. create插入数据,效率极低,每次都要访问数据库,从而导致很慢
  2. bulk_crate:插入数据,效率高,相当于只访问了一次数据库
  3. 两者效率相差很大

三、 创建多对多表关系三种方式

方式一:自行创建第三张表

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")

总结:

  1. 自动创建第三张表

    • 好处在于 django orm会自动帮你创建第三张关系表
    • 坏处它只会帮你创建两个表的关系字段,不能额外的添加字段
    • 创建第三张表虽然方便但是扩展性较差,不能够添加额外的字段
  2. 纯手动创建第三张表

    • 好处在于第三张表可以任意的添加额外的字段
    • 坏处在于orm查询的时候,很多方法都不支持,从而导致查询数据的时候非常的麻烦
  3. 半手动创建第三表

    • 可以创建额外的字段

    • 手动创建表,会告诉orm,第三张表是自己创建的的,orm主需要给我们提供方便的查询方法

    • 虽然可以使用orm查询的方法,但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系。

    • 半自动 一定要加两个额外的参数: through='Book2Author', through_fields=('book','author')

    • 后面字段的顺序: 由第三张表通过哪个字段查询单表 就把哪个字段放前面

四、MVC框架和MTV框架

MVC框架

MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

img

Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

模型: 负责业务对象与数据库的映射(ORM),视图: 负责与用户的交互(页面),控制器: 接受用户的输入调用模型和视图完成用户的请求

Django的MTV模式

Model(模型):负责业务对象与数据库的对象(ORM)

Template(模版):负责如何把页面展示给用户(html)

View(视图):负责业务逻辑,并在适当的时候调用Model和Template

此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

Django框架图示

img

五、Django的请求生命流程图

img

posted @ 2019-10-28 21:49  RandySun  阅读(226)  评论(0编辑  收藏  举报