创建模型

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

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':'abc@example.com'}
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,等等,不太明白怎么用,看来以后要恶补一下数据库的知识了。

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

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

  1. Django 学习笔记之模型高级用法

    目录 1 复杂的字段类型 1.1 整数类型的区别 1.2 自增类型的区别 1.3 时间类型 1.4 FilePathField 1.5 FileField 1.6 ImageField 2 关系字段 ...

  2. Django学习日记07_Admin

    django.contrib django.contrib是django中附带的一个工具集,由很多的附加组件组成.这些附加组件包括管理工具(django.contrib.admin).用户鉴别系统(d ...

  3. Django学习日记02_项目环境

    创建一个工程: django-admin.py startproject mySite 将会产生以下文件: mySite/    manage.py    mySite/        __init_ ...

  4. django 学习-6 定义模型--数据库的使用

    1.service mysqld start  首先数据库是可用的 2.rpm -qa |grep MySQL-python  这个包是存在的 3.vim settings 修改databases 加 ...

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

    URLconf Django通过URLconf来响应网页请求,在项目设置settings.py中,设定了ROOT_URLCONF值来指定默认的URLconf(即mysite.urls),当HTTPRe ...

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

    Variables 在模板中,使用两个大括号包含变量的方式来使用变量: {{ name }} 该变量应该作为键值对中的键,在Context中能被查找到. Tags 模板中使用Tags来进行简单的逻辑: ...

  7. Django学习日记04_模板_overview

    通过Django中的模板,使得设计人员和网站管理有一个对接的接口,实现网页设计和逻辑的分离,因此,模板会处理大量的文本解析内容,django中内部使用了高效的引擎来完成模板解析. 模板设置 在使用模板 ...

  8. Django学习日记01_环境搭建

    1. 使用Vagrant 创建ubuntu虚拟机: 首先安装vagrant,网上有比较多的方法,如:http://www.th7.cn/system/mac/201405/55421.shtml 我使 ...

  9. Django学习笔记二

    Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...

随机推荐

  1. html5的结构

    目录 一.新增的主体结构元素 1.1.article元素 1.2.section元素 1.3.nav元素 1.4.aside元素 1.5.time元素 1.6.pubdate元素 二.新增的非主体结构 ...

  2. windows10版本1709 在桌面和文件中点击右键,会引起卡顿

    windows自动升级到1709版本后出现的问题,而之前是没有这种问题的. 最终解决办法:(需要设置注册表) 运行:快捷键Win+R regedit 路径:可直接复制后粘贴+回车 HKEY_CLASS ...

  3. always中的敏感变量

    always语句下如果有判断语句if,那么if语句中的条件必须有always中的敏感变量. 否则错误提示为:Error (10200): Verilog HDL Conditional Stateme ...

  4. 側滑回退的layout(相似IOS側滑回退到上一个activity)

    用过apple的同学应该都知道,大多数IOS应用都支持側滑回退,就不具体说明了,直接上图: 作为使用ios的android开发人员来说,我是特别喜欢这个功能的.既然这样,那就在android上也实现这 ...

  5. Javascript--cookie创建与查看

    创建cookie 以下代码将创建一个cookie,该cookie名称为UserName,值为Paul,过期时间为7天后(2015年6月29日) <span style="font-si ...

  6. Python的招牌菜xmlrpc

    一.简单介绍 为了解决在系统的80port提供RPC的服务.而又不影响正在运行的WEB服务.人们想出了用HTTP协议传输RPC包的办法.对于差点儿是专门用于传输文本的HTTP协议.要在其上传输RPC封 ...

  7. Unity打包android的apk与数据包.obb分离和apk签名

    那么,通过以上图片.我相信大多数人已经知道怎么创建了,apk签名比較简单,假设之前没有签名文件.那么选择图中的Create New Keystore然后在以下两个password框中输入passwor ...

  8. android-xBuild apk差分与合成,zip差分与合成,lua打包,apk打包,png/jpg图片压缩

    android-xBuild 是一项集成了apk差分与合成,zip差分与合成,lua打包.apk打包,png/jpg图片压缩五大功能的开源项目 (github地址:https://github.com ...

  9. WPF中展示HTML

    业务需求:将具有表格信息的HTML片段在WPF中展示出来,并像网页端一样,可以进行input的填写,checkbox选择,最后以HTML的形式完成保存. 天真的以为直接引入WPF中的WebBrowse ...

  10. TableML-GUI篇(Excel编译/解析工具)

    项目情况 本文接上篇TableML Excel编译/解析工具,本文主要介绍GUI工具的使用,及配置项,如果你想了解此工具更加详细的说明,请阅读上篇文章. 项目地址:https://github.com ...