Django学习日记03_模型_Fields

创建模型

模型对应工程中的应用,一个工程可能包含很多的应用,通过命令

python manage.py startapp myapp

创建一个叫myapp的应用,django会帮助生成以下目录:

polls/
? ? __init__.py
? ? admin.py
? ? migrations/
? ? ? ? __init__.py
? ? models.py
? ? tests.py
? ? views.py

其中,models.py 中就是实现模型设计的地方。

python通过模型的搭建避免直接操作数据库,而通过配置数据库环境,在不改变模型的情况下对数据库进行切换也没有问题,不仅方便数据库升级或者改变,也方便管理数据模型。

根据djangodocument的指引,编辑models.py创建一个Person的模型:

class Person(models.Model):
? ? first_name = models.CharFeild(max_length=30)
? ? last_name = models.CharFeild(max_length=30)

以上就创建了一个Person模型,对应到数据库,可以看成是创建了一个表单,包含first name和last name两个字段以及django自动创建的主键:id。如果想要指定主键而不是自动创建的id作为主键的话,需要在CharFeild对象初始化时添加属性:primary_key = True 。

Fields

Fields是模型最重要的一部分,是数据的主体。和数据库相对应的,Field也有很多的类型,用得比较多的如上例的CharField创建字符型字段,BigIntegerField可以创建64位最大整形的字段,TextFeild可以创建大字符串字段,BinaryField可以创建字节型字段,BooleanFeild可以创建布尔型字段,还有一些表示功能的EmailField、DateField、TimeField、DateTimeField、IPAddressField等等。

除了指定Field类型外,还需要通过一定的属性来加以约束。如设置blank属性为True则允许字段为空,否则不允许;通过设置default属性可以指定一个默认值,该默认值会在所有的模型实例中都会被引用,所以绝对不能是一个可变对象(字典、列表、集合等),否则所有的实例都引用同一个对象,可想而知改变都是同步的,如果需要用到可变对象的话,应该将其包装成可执行的对象,如下例中,JSON字段将一个字典作为默认值:

def contact_feild_default():
? ? return {‘email‘:‘[email protected]‘}
contact_info = models.JSONField("ContactInfo",default=contact_feild_default)

通过指定choices属性,可以将该字段变为可选值,可选值必须是可迭代的:

PROVINCE_CHOICES = (
? ? (‘ZJ’,‘Zhejiang‘),
? ? (‘FJ‘,‘Fujian‘),
? ? (‘BJ‘,‘Beijing‘),
? ? (‘SH‘,‘Shanghai‘),
)
address = models.CharFeild(max_length = 3 ,choices = PROVINCE_CHOICES,default=‘ZJ‘)

其中,元组中的第一个元素表示在数据库中实际使用的内容,第二个元素是便于使用者理解的名字。

可选常量都要写在类定义中,一来可以便于管理命名空间,第二可以方便调用一些常量。在django1.7中,新添加了分组的可选模式

MEDIA_CHOICES = (
? ?(‘Audio‘, (
? ? ? ? ? ? (‘vinyl‘, ‘Vinyl‘),
? ? ? ? ? ? (‘cd‘, ‘CD‘),
? ? ? ? )
? ? ),
? ? (‘Video‘, (
? ? ? ? ? ? (‘vhs‘, ‘VHS Tape‘),
? ? ? ? ? ? (‘dvd‘, ‘DVD‘),
?? ? ? ?)
? ? ),
? ? (‘unknown‘, ‘Unknown‘),
)

分组模式中可以包含未分组的元组,前两个分组中,Audio、Video表示组别,组别内的元组第一个元素是实际使用的值,第二个元素是便于使用者理解的名字。

django支持的都是关系型数据库,可以在Field中指定关系模型。如ForeignKey指定外键:

class Car(models.Model):
? ? manufacturer = models.ForeignKey(‘Manufacturer‘)
? ? # ...
class Manufacturer(models.Model):
? ? # ...
? ? pass

在ForeignKey中使用一个字符串来表示要使用的外键的模型名,django会解析该字符串,并找到响应的模型。如果该模型不在同一个app中,使用 ForeignKey(‘appname.ModelName’)同样可以完成解析。

可以指定外键的属性来加以约束,如related_name,related_query_name,to_field,on_delete,等等,不太明白怎么用,看来以后要恶补一下数据库的知识了。

通过外键可以实现比较复杂的多对多的数据模型

时间: 2024-12-21 01:27:42

Django学习日记03_模型_Fields的相关文章

Django学习日记02_项目环境

创建一个工程: django-admin.py startproject mySite 将会产生以下文件: mySite/? ? manage.py? ? mySite/? ? ? ? __init__.py? ? ? ? settings.py? ? ? ? urls.py? ? ? ? wsgi.py 配置工程 编辑settings.py文件,在里面修改工程的一些设定: 1. 数据库引擎 默认数据库引擎为sqlite3,如果修改为mySQL或者postpreSQL等,则应该在DATABASE

Django学习日记07_Admin

django.contrib django.contrib是django中附带的一个工具集,由很多的附加组件组成.这些附加组件包括管理工具(django.contrib.admin).用户鉴别系统(django.contrib.auth).PostgreSQl详细信息提取(django.contrib.postgres).匿名会话(django.contrib.sessions)等等.详细的列表可以在Djangodocument里面查看到. 使用管理工具 通过设置settings.py来激活站点

Django学习日记04_模板_overview

通过Django中的模板,使得设计人员和网站管理有一个对接的接口,实现网页设计和逻辑的分离,因此,模板会处理大量的文本解析内容,django中内部使用了高效的引擎来完成模板解析. 模板设置 在使用模板前,需要对django进行配置,在项目目录的setting.py中, TEMPLATES = [? ? {? ? ? ? 'BACKEND': 'django.template.backends.django.DjangoTemplates',? ? ? ? 'DIRS': [? ? ? ? ? ?

Django学习系列之模型

Django ORM简介 介绍 关系对象映射(Object Relational Mapping) Django中遵循Code first的原则,即根据代码中定义的类生成数据库 ORM中: 我们写的类表示数据库的表名 根据这个类创建的对象是表结构 Django ORM 一对多关系例子 定义urls.py from django.conf.urls import url from django.contrib import admin #导入django admin admin.autodisco

Django学习日记06_视图_URLconf、View

URLconf Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRequst中没有urlconf属性的话,便会访问该默认值. 在urlconf中,设定了一组pattern: urlpatterns = [? ? url(r'^admin/', include(admin.site.urls)),] 可以往该列表中添加需要的url函数,每个url函数包含两个参数:匹配

Django学习日记05_模板_模板语言

Variables 在模板中,使用两个大括号包含变量的方式来使用变量: {{ name }} 该变量应该作为键值对中的键,在Context中能被查找到. Tags 模板中使用Tags来进行简单的逻辑: {% commet %}? ? #body{% endcommet %} Django内置了大量的Tags: 1. if :使用if标签来实现分支逻辑 {%if option%}? ? #if body{%elif option2%}?? ? #elif body{%else%}?? ? #els

Django学习日记01_环境搭建

1. 使用Vagrant 创建ubuntu虚拟机: 首先安装vagrant,网上有比较多的方法,如:http://www.th7.cn/system/mac/201405/55421.shtml 我使用了ruby的包管理工具gem安装:gem install vagrant 之后mkdir myUbuntu vagrant init?ubuntu/trusty64 vagrant up vagrant ssh 就登陆到了创建的ubuntu虚拟机中 2. 配置ubuntu: 首先,使用apt-ge

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

django学习の模型

orm:对象数据库和模型的映射.如果想以简单的方式去操作数据库,例如用类的方式去操作,就像 p = Person.get(id = 1),那么就必须使得代码和数据库的结构具有映射关系,实现这种关系,你可以事先就预先好一套创建类以及到数据库表的对应关系,也可以实时追踪数据库结构,很明显,第二张方式实现起来比较影响效率,所以大多数时候,在一开始,就用模型来对应数据库的一种关系,然后保证它们结构统一,就可以实现高度封装sql语句,用简洁明了的方式去操作业务逻辑,就像p = Person.get(id