热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

最全得django讲解,零基础从入门到精通(No2—模型)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于腾讯云作者:Python进阶者(想要学习Pytho

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于腾讯云 作者:Python进阶者

( 想要学习Python?Python学习交流群:1039649593,满足你的需求,资料都已经上传群文件流,可以自行下载!还有海量最新2020python学习资料。 )

django从入门到精通No.2—-模型

一、前言

学过orm系统自然之道模型的重要性,很多web站点都需要与数据库交互,这个时候模型的设计就显得尤为重要,一个好的模型会使得项目方便管理并且易于维护,比如我们学过的flask,里面的sqlalchemy就是这样一个优秀的模块,通过它可以快速和数据库建立通道,从而使得web编程更为高效,本文主要讲解django的模型。

二、模型的定义

模型可以定义储存数据的字段和值,比如我们在进行表单提交的时候,一些注册信息就可以利用模型来进行管理,然后统一提交到数据库中。简单来说,模型是与数据库有关的操作集合。

三、模型的字段和约束

这里我们需要在he文件夹中找到models.py文件,然后我们试着改动一下这个文件的内容,如下:

from django.db import models
​
# Create your models here.
class book(models.Model):
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()

[email protected]#码网

用于制作模型的每个类都必须继承models.Model类,然后我们会使用字段来对数据进行记录,django中有很多字段,如下:

四、关联关系

django提供了三种数据库关联关系,即多对一,一对一,多对多,废话不多说,就是干。

1.多对一

因为是关联关系,所以我们必须指定两个类来进行相互操作,这里涉及到一个外键的操作,即ForeignKey字段,而且外键要定义在多的一方。我们先来创建两个类,如下:

from django.db import models
​
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    bk=models.ForeignKey(book,on_delete=models.CASCADE)

ForeignKey提供了多个参数,如下

ForeignKey()
    to                # 要进行关联的表名
    to_field=None     # 要关联的表中的字段名称
    on_delete=None    # 当删除关联表中的数据时,当前表与其关联的行的行为
                      - models.CASCADE,删除关联数据,与之关联也删除
                      - models.DO_NOTHING,删除关联数据,引发错误IntegrityError
                      - models.PROTECT,删除关联数据,引发错误ProtectedError
                      - models.SET_NULL 删除关联数据,与之关联的值设为null(前提FK字段需要设为可空)
                      - models.SET_DEFAULT 删除关联数据,与之关联的值设为默认值(前提FK字段设置默认值)
                        - models.SET,删除关联数据,
                               1. 与之关联的值设置为指定值,设置:models.SET(值)
                               2. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
    related_name=None      # 反向操作时,使用的字段名,用于代替表名_set
    related_query_name=None,# 反向操作时,使用的连接前缀,用于替换【表名】
    limit_choices_to=None,    # 在Admin或ModelForm中显示关联数据时,提供的条件,字典类型
    db_cOnstraint=True          # 是否在数据库中创建外键约束
    parent_link=False           # 在Admin中是否显示关联数据

2.多对多

多对多的表,必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的外键。如下:

from django.db import models
​
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    bk=models.ForeignKey(book,on_delete=models.CASCADE)
class title(models.Model):
    start=models.DateTimeField(default=timezone.now)
    end=models.DateTimeField(auto_now=True)
    p=models.ManyToManyField(book)

如果你想知道更多成员关系的细节,你可以指定一个中介模型来定义多对多关系,可以将其它字段放在中介模型中,源模型的字段使用through参数指向中介模型。如下:

from django.db import models
from django.utils import timezone
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
class title(models.Model):
    start=models.DateTimeField(default=timezone.now)
    end=models.DateTimeField(auto_now=True)
    p=models.ManyToManyField(people,through="zj")
class zj(models.Model):
    bk=models.ForeignKey(book,on_delete=models.CASCADE)
    p=models.ForeignKey(people,on_delete=models.CASCADE)
    dt=models.Datefield()

所有参数如下:

ManyToManyField()
    to                         # 要进行关联的表名
    related_name=None          # 反向操作时,使用的字段名,用于代替表名_set
    related_query_name=None    # 反向操作时,使用的连接前缀,用于替换表名
    limit_choices_to=None      # 在Admin或ModelForm中显示关联数据时,提供的条件,字典类型
    symmetrical=None            # 仅用于多对多自关联时,用于指定内部是否创建反向操作的字段,boolean类型
    through=None                # 自定义第三张表时,使用字段用于指定关系表
    through_fields=None         # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
    db_cOnstraint=True          # 是否在数据库中创建外键约束
    db_table=None              # 默认创建第三张表时,数据库中表的名称

3.一对一

一对一其实就是 一对多 + 唯一索引,当两个类之间有继承关系时,默认会创建一个一对一字段,一对一使用OneToOneField来实现,如下:

from django.db import models
​
# Create your models here.
class book(models.Model):
    id=models.AutoField(primary_key=True)
    book_name=models.CharField(max_length=30)
    book_price=models.IntegerField()
class people(models.Model):
    article=models.CharField(max_length=20)
    age=models.IntegerField()
    b=models.OneToOneField(book)

它里面的参数如下:

OneToOneField()
    to                 # 要进行关联的表名
    to_field=None      # 要关联的表中的字段名称
    on_delete=None     # 当删除关联表中的数据时,当前表与其关联的行的行为

五、管理员登陆
为了能让大家提前看到django的数据操作,django内置了一款非常到位的系统管理员登陆设计系统,首先我们创建下用户,如下:

python manage.py createsuperuser

然后我们按照要求一步步设置参数,如图:

然后我们启动服务器并且进入到下图这个页面中去,如图:



推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 阿里云虚拟主机安装多个织梦系统的方法
    本文介绍了在阿里云虚拟主机上安装多个织梦系统的方法。通过创建不同名称的文件夹并将不同的域名解析到对应的目录,可以实现多个系统的安装。在安装过程中需要注意修改数据库前缀,并在系统设置中还原数据库。同时还介绍了阿里云虚拟主机二级域名绑定二级目录和域名重定向的用法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
铁骑侠客_685
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有