摘要:当然还有其他高级的使用,日后再说完整的用户名邮箱联系地址留言信息用户留言信息使用之前已经定义好了数据模型的字段元数据方法等。
前言
接续前文,上一篇文章主要涉及了 Django 项目的基础配置等,这篇主要涉及数据库相关的 ORM ,也就是 Django 中的 Model 的使用,MVT 三层之间的交互
教程基本都是东拼西凑的,防止有些东西表述不准确,因为我之前写 JavaScript 比较多。但是里边注入了自己的理解,尽量讲清楚。
基础环境Pycharm 2018
Django 2.0.3
Python 3.6.4
mxonline start 分支
Django Model 配置代替使用原生的 SQL 语句操作数据库。
原生 SQL 语句操作数据库# {BASE_DIR}/apps/message/models.py import MySQLdb def book_list(request): db = MySQLdb.connect(user="me", db="mydb", password="secret", host="localhost") cursor = db.cursor() cursor.execute("SELECT name FORM books ORDER BY name") names = [row[0] for row in cursor.fetchall()] db.close()配置 Django Model
具体的一些细节知识下面会进行叙述。这里只是展示一下如何配置。
# {BASE_DIR}/apps/message/models.py # 从 Django 中引入 models from django.db import models # Create your models here. class UserMessage(models.Model): name = models.CharField(max_length=20, verbose_name=u"用户名") email = models.EmailField(verbose_name=u"邮箱") address = models.CharField(max_length=100, verbose_name=u"联系地址") message = models.CharField(max_length=500, verbose_name=u"留言信息") class Meta: verbose_name = u"用户留言信息" verbose_name_plural = verbose_name
model 创建完成,接下来是生成数据表。
生成数据表$ python manage.py makemigrations message $ python manage.py migrate message
然后查看数据库是不是生成了表。
之前有十个表,分别是:
+----------------------------+ | Tables_in_test_django | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+ 10 rows in set (0.00 sec)
现在:
+----------------------------+ | Tables_in_test_django | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | message_usermessage | +----------------------------+ 11 rows in set (0.00 sec)
mysql> desc message_usermessage; +---------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(20) | NO | | NULL | | | email | varchar(254) | NO | | NULL | | | address | varchar(100) | NO | | NULL | | | message | varchar(500) | NO | | NULL | | +---------+--------------+------+-----+---------+----------------+ 5 rows in set (0.04 sec)
对应上面 Model 中的字段,完美~
注意事项ChartField 必须指定 max_length。
ORM 功能介绍稍候会有完整的 Model 例子。
字段 Field每一个模型都可以包含有任意数量的字段,每个字段都会对应数据表中的一个字段,我们需要指定字段的属性。
name = models.CharField(max_length=20, verbose_name=u"用户名")
上述字段的名称是 name,类型是 models.CharField。对应到 MySQL 数据中是 varchar 类型。varchar 类型的字段都是需要去指定一个长度值,对应到 Django 的 ORM 模型上就是 max_length 属性。
字段参数下面列举一下目前笔者在开发中用到的一些字段:
max_length:指定字段的长度值,接受一个数字,CharField 必须指定最大长度, TextField 不需要。
verbose_name:字段标签的可读名称,接受一个字符串。如果不指定,Django 会从字段名称去推断默认的详细名称,建议每一个字段都进行指定。
default:字段默认值。
null:是否可以为 null,接受 True 或者 False。
blank: 是否可以为空,同样接受 True 或者 False。
primary_key:如果设置为 Ture,则该字段置为模型主键,如果模型中没有指定主键,则 Django 会自动为模型添加一个主键,默认为 id。
help_text:为 HTML 表单文本提供单文本标签。
choices:一组字段选项,提供这一项的时候,默认对应的表单不见是选择字段的盒子,而不是标准文本字段。
字段类型CharField:用来定义短到中等长度的字段字符串,必须指定 max_length 属性。
TextField:用于大型的任意长度字符串,不强制要求指定 max_length 属性,指定的 max_length 仅仅当该字段以表单显示才会使用,不会再数据库级别进行强制执行。
IntegerField:用于存储整形数据,在用于表单中验证输入的值需要时整数。
FloatField:用于存储浮点型数据
DateField 和 DateTimeField:用于存储/表示日期和日期/时间信息(分别是Python.datetime.date和datetime.datetime对象。这些字段可以另外表明(互斥)参数auto_now=Ture (在每次保存模型时将该字段设置为当前日期),auto_now_add(仅设置模型首次创建时的日期)和default(设置默认日期,可以被用户覆盖)。一般笔者选择的默认日期是 datetime.now。
EmailField:用来存储和验证电子邮件地址。
FileField:用于上传文件,需要提供 upload_to 指定上传到的地方。
ImageField:和上传文件表现基本相似,会额外进行是否为图像的验证。
AutoField:是一种 IntegerField 自增的特殊类型,如果模型没有指定主键的话,此类型的主键将自动添加到模型中。
ForeignKey:外键,用于指定与另一个数据库模型的一对多关系。关系 “一” 侧是包含密钥的模型。和 flask 指定外键的方式不同。
ManyToManyField:用于指定多对多关系,例如,一本书可以有几种类型,每种类型可以包含几本书)。在我们的图书馆应用程序中,我们将非常类似地使用它们ForeignKeys,但是可以用更复杂的方式来描述组之间的关系。这些具有参数on_delete来定义关联记录被删除时会发生什么(例如,值models.SET_NULL将简单地设置为值NULL)。笔者用的不是很多。
元数据通过声明 class Meta 来声明模型级别的元数据
class UserMessage(models.Model): # Config Field class Meta: ordering = ["id"] verbose_name = u"用户留言信息" verbose_name_plural = verbose_name
这里最有用的功能是可以指定模型返回数据时候的默认的顺序,更多的文档可以查看这里
方法一个模型也可以有方法,最基本的使用就是定义一个标准的 Python 类方法: __str__:
class UserMessage(models.Model): # Config Field # Config Meta def __str__(self): return self.message
这样为每个对象返回一个人类可读的字符串。当然还有其他高级的使用,日后再说
完整的 model# {BASE_DIR/apps/message/models.py} from django.db import models # Create your models here. class UserMessage(models.Model): name = models.CharField(max_length=20, verbose_name=u"用户名") email = models.EmailField(verbose_name=u"邮箱") address = models.CharField(max_length=100, verbose_name=u"联系地址") message = models.CharField(max_length=500, verbose_name=u"留言信息") class Meta: ordering = ["id"] verbose_name = u"用户留言信息" verbose_name_plural = verbose_name def __str__(self): return self.message使用 Django ORM
之前已经定义好了数据模型的字段(Field)、元数据(Meta)、方法(Method)等。现在要做的是把页面上提交过来的数据通过 ORM 来存放到数据库中,通过 ORM 来进行数据的 CURD 操作。
创建数据在 templates 中已经创建了 message_form.html 模板文件,现在进行修改,修改 form 的 action 目标地址:
在上一篇文章中,提到过,path 接收 name 参数。在 template 中可以通过 name 来取到对应的 url,方法如下:
action="{% url "go_form" %}"
这样做提供了另一种获取 url 的方式,当我们因为某种原因去修改了 url 地址之后,通过 name 还能找到它。
在 textarea 中,有这样一段代码:
{{ my_message.message }}
作用是取到传入的 my_message 对象的 message 属性取出来并显示,由于 html 基本属于前端部分了,所以用前端的方式进行描述。
双花括号(八字胡)语法: {{...}} 在任何模板语言中都很常见,作用是将数据渲染到双括号内部。
上面还有一部分代码是这样子的:
{% if my_message.name == "test" %}test{% endif %}"
意思很好懂的,是吧。
具体的 Django 中模板的语法可以查看官方文档。
后记这里只是简单的介绍了一下 Django 中 Model 层、View 层、以及 Template 层之间交互的部分知识,很简略,不详细。在每部分的后边都附加了详细的官方文档地址。如果以后有时间了可以对每部分进行详细的阐述。
参考资料Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台
MDN 的 Django教程 ———— 设计LocalLibrary模型
Django 官方文档 Model 部分
Django Girls 教程
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41442.html
摘要:将业务逻辑,数据和界面显示分开,功能划分清晰,有利于降低软件的耦合度和团队开发。主要的作用就是将一个请求分发到不同的处理,再调用相应的和关于的安装及使用将在下一章共同学习。 Django 简单介绍django和mvc,mvt设计模式,如果已知悉可以直接跳过。 什么是Django 是由python写的一个开源的web应用程序框架,于2005年7月初次发布,并在2008年9月发布了第一个正...
摘要:声明本渣渣部分代码参考自其实有很多代码是不需要自己一行行码出来,生产力是第一位。只有研究型人才需要生产代码,作为一名渣渣拿来用是最高效的做法。程序员都有一个开源的精神,码出来的代码本身是希望更多的人用到,应用到生产中。 声明:本渣渣部分代码参考自TendCode其实有很多代码是不需要自己一行行码出来,生产力是第一位。只有研究型人才需要生产代码,作为一名渣渣拿来用是最高效的做法。程序员都...
摘要:声明本渣渣部分代码参考自其实有很多代码是不需要自己一行行码出来,生产力是第一位。只有研究型人才需要生产代码,作为一名渣渣拿来用是最高效的做法。程序员都有一个开源的精神,码出来的代码本身是希望更多的人用到,应用到生产中。 声明:本渣渣部分代码参考自TendCode其实有很多代码是不需要自己一行行码出来,生产力是第一位。只有研究型人才需要生产代码,作为一名渣渣拿来用是最高效的做法。程序员都...
阅读 3457·2021-11-12 10:36
阅读 2812·2021-09-22 15:35
阅读 2770·2021-09-04 16:41
阅读 1133·2019-08-30 15:55
阅读 3544·2019-08-29 18:43
阅读 2044·2019-08-23 18:24
阅读 1340·2019-08-23 18:10
阅读 1894·2019-08-23 11:31