Django进阶,必须深刻了解Django的MTV模式。

M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。

T 代表模板 (Template):负责如何把页面展示给用户(html)。

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

1. Django的字段概念解析

Model模型,负责对象和数据库的关系映射,所以Model本质是Python的数据类型,但它代表的是一个数据库的数据表。

数据库表格中有非常多的字段,例如char、varchar、date、datetime、text、int等,那在Model当中,也会有对应的类型,如:CharField、IntegerField、TextField;

以表格形式展示:

类型说明参数CharField字符串类型max_length、null、blankIntegerField整数类型int、null、blankTextField文本类型text、null、blankBooleanField布尔类型null、blankEmailField带邮箱检测的字符串类型null、blank

当然还有一些本质和数据库类型是一样的,只是Django对他进行了很好的模拟,让开发者在使用的时候,可以更方便的写业务需求,而撇开本质上的数据类型纠结,如:ImageField、FileField、URLField,如下表格(还有很多):

类型说明参数ImageField字符串类型upload_to*、height_field、width_fieldFileField字符串类型upload_to*IPAddressField字符串类型null、blankURLField字符串类型null、blank

数据库里面有外键的一个设置,可供sql的联合查询,但是Django有更强大的一个逻辑查询,一对一、多对一、多对多的关系,下面一个表格介绍下Django 的关系字段:

类型关系说明OneToOneField一对一直接关联,查询直接返回对象ForeignKey多对一查询返回对象的列表集合ManyToManyField多对多查询返回对象的列表集合

2. 博客项目的实践操作

Django自带的UserModel字段有账户、密码、邮箱、FirstName、LastName、用户权限、组、最后登陆时间、注册时间、活跃状态、超级管理员选项、管理员登陆状态这几项,当然这无法满足一些常见的业务需求,所以必须给User表进行一个拓展信息表....

3. 一对一关系的使用

设定一个一一对应的拓展信息表,使用字段是models.OneToOneField(),用来定义一对一关系。

简单理解,它与声明了 unique=True 的 ForeignKey 非常相似,不同的是使用反向关联的时候,得到的不是一个对象列表,而是一个单独的对象。

首先先来看最简单的一个拓展信息定义:

class UserProfile(models.Model):

belong_to = models.OneToOneField(to=User, related_name='profile')

address = models.CharField(max_length=500, default="you guess")

def __str__(self):

return 'username:'+self.belong_to.username+' address:'+self.address使用OneToOneField,里面至少需要一个参数,是指定关联的Model类(这里是User)

OneToOneField的第二个参数是反向查询的,如果没有,则无法通过User查询到它的拓展信息(加上还是好的)

address是额外辅助使用的,User表里面没这个字段

通过makemigrations和migrate后,将Model注册到admin中,从admin界面查看管理,首先是正常关联:

在User已经关联了UserProfile的情况下,再次关联,则会报错,如图:

这也是一一对应的一个特性,无法重复关联。

4. 逻辑上的错误和技术上的方案

当然这点也很容易报错,逻辑出错类型有以下几点:关联不存在,使用UserProfile查询belong_to或者User反向查询会报错

已经关联,重复创建关联会报错

如果User关联了UserProfile,而此时User注销后删除,UserProfile会出错

不过在OneToOneField定义的时候,也会考虑到这些问题,首先是解决第三个,User关联了UserProfile,这时删了User,UserProfile的关联对象失效,则UserProfile也会被删除,这是Django默认的级联删除。on_delete加不加无所谓,默认值就是None。

当on_delete为None时,Django默认会给on_delete赋值为models.CASCADE,绑定删除是执行级联删除的操作。

如下是一种不执行级联删除的操作,修改默认逻辑。如果User删除,对应的UserProfile改成Null,代码如下:

class UserProfile(models.Model):

belong_to = models.OneToOneField(to=User, related_name='profile',on_delete=models.SET_NULL, null=True)

address = models.CharField(max_length=500, default="you guess")

def __str__(self):

if self.belong_to:

return 'username:'+self.belong_to.username+' address:'+self.address

else:

return 'address:'+self.address

允许设置NULL,就必须设置null=True。

另外两点,例如User存在,但是在没关联UserProfile使用profile属性是会报错的,这点的解决方案就是在新建User时,自动新建对应的UserProfile并关联。

5. 测试操作

测试结果很简单,登陆Admin界面,新建User、新建UserProfile、删除User,查看UserProfile的操作结果,如果是级联删除,UserProfile也会消失;

如果是设置为NULL,则在UserProfile的界面会出现一个叉叉的图标,点击会问你是否确定删除用户,如下图:

首发于《Crossin的编程教室》

以上就是本篇文章的全部介绍内容了

!放在最后

如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复

如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货

python和django的关系_Django一对一关系实践相关推荐

  1. python框架django的使用_Django框架的基本使用,若依框架

    Django框架的基本使用,若依框架 Django框架的基本使用 Django是一个功能强大的web框架 框架模式 1.MVC和MTV框架 MVC:Web服务器开发领域里著名的MVC模式,所谓MVC就 ...

  2. python框架django文档_Django基础——Django框架介绍及模板语言

    Django框架,我们只需要关心二点: 1.根据用户访问不同的路径执行不同的函数 2.从HTML读取出内容,并且完成字符串的替换 而socket通信不需要我们自己写: 新建Django项目 命令行创建 ...

  3. 什么是数据库中的一对一关系?

    什么是数据建模中的一对一关系?如何在数据库中实现这种关系?本文中的示例将回答这些问题. 数据建模中的实体(表)之间有三种类型的关系: 一对多关系(也表示为 1:M). 多对多关系 (M:N). 一对一 ...

  4. django与python之间关系_Django 模型中表与表之间关系

    有过数据库相关经验的人一定知道,数据库中的表一般不是独立存在的,表与表之间都会存在联系,Django的模型是数据库表与Python类之间的映射,那么模型之间也会存在关系,Django的模型之间存在3中 ...

  5. django 设置外键_django2.0前后版本定义外键和一对一关系的差别

    概述 Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete',简单记录下解决过程. ...

  6. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  7. django orm级联_Django数据表关联关系映射(一对一、一对多、多对多)

    我们知道涉及到数据表之间的对应关系就会想到一对一.一对多.多对多,在学习 MySQL 数据库时表关系设计是需要重点掌握的知识.Django 中定义了三种关系类型的字段用来描述数据库表的关联关系:一对多 ...

  8. python django前端重构_Django学习笔记(11)——开发图书管理页面

    基础需求:75% 1. 列出图书列表.出版社列表.作者列表 2. 点击作者,会列出其出版的图书列表 3. 点击出版社,会列出旗下图书列表 4. 可以创建.修改.删除 图书.作者.出版社 升级需求:10 ...

  9. Django框架(14.Django中模型类的关系,以及模型类关联查询)

    Django中模型类的关系,以及模型类关联查询 1.模型类关系 1.1 一对多关系 1.2多对多关系 1.3 一对一关系 1.4 一对多举例: 1.5 多对多举例: 1.6 一对一举例: 2.关联查询 ...

  10. Python中怎样改变集合之间的关系?

    Python中怎样改变集合之间的关系?数学中,两个集合关系的常见操作包括:交集.并集.差集.补集.设A,B是两个集合,集合关系的操作介绍如下: 交集是指属于集合A且属于集合B的元素所组成的集合, 并集 ...

最新文章

  1. 皮一皮:现在上门流行这样了?
  2. Spring MVC RedirectAttributes的用法解决办法
  3. 51Nod 1003 阶乘后面0的数量 | 思维
  4. [bbk4343]小布-OCP 042全真试题讲解
  5. 制作自己的linux内核,打造属于你自己的Linux系统
  6. h3c 虚拟服务器 下一跳,H3C vLNS系列虚拟L2TP网络服务器 配置指导-E0324-5W100
  7. 魅族官宣好消息:魅族16s Pro暮光森林终于要来了
  8. C++ new 的三种面貌
  9. Python中的map、zip、filter、reduce函数使用
  10. java 中 集合类相关问题
  11. linux中级之防火墙的数据传输过程
  12. java---servlet与filter的联系与区别
  13. 使用ACR122U和Proxmark3复制IC卡
  14. 微信抢号软件_快来抢微信靓号!微信小商店正式上线
  15. c++ 制作蠕虫病毒
  16. 08CMS之开发模式设置
  17. vue3.x 中使用 vant <van-image>图片不显示的问题
  18. NDK开发——Android Studio+CMake实现QQ变声效果
  19. 基于法线的点云双边滤波
  20. 机器学习_正规方程(最小二乘法)的推导

热门文章

  1. 23 模块代码编写基础
  2. 机器学习项目中使用统计学方法的十个例子
  3. kafka-spark-streaming-mysql(scala)实时数据处理案列
  4. 在线教育平台签约电子化:借电子印章提速控本、服务师生
  5. 又是一个github吗? Kubernetes 初创公司 Heptio被VMware 收购
  6. @EnableWebMVC注解理解
  7. Veeam backup job(3)
  8. 通过angularjs的directive以及service来实现的列表页加载排序分页
  9. Android开发学习总结(五)——Android应用目录结构分析(转)
  10. Instagram技术透析:Mike Krieger, Instagram at the Airbnb tech talk, on Scaling Instagram