二、Django创建数据库模型

* { font-family: "lucida grande", "lucida sans unicode", lucida, helvetica, "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif }
body { margin: 0 }
h2 { font-size: 24px; height: 35px; line-height: 35px !important; width: 95%; background-color: #169FE6; padding-left: 10px; color: white }
h3 { font-size: 18px }
h4 { font-size: 14px }
.note-container { width: 100%; margin: auto; padding: 10px 20px }
#title { margin: 0 }
table { margin-bottom: 16px; border-collapse: collapse; max-width: 95% }
table th,table td { padding: 6px 13px; border: 1px solid #ddd }
table th { font-weight: bold }
table tr { background-color: none; border-top: 1px solid #ccc }
table tr:nth-child(2n) { background-color: rgb(247, 247, 249) }
.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption { border: 1px solid #ddd; border-collapse: collapse; padding: 6px 13px }
blockquote { border-left-width: 10px; background-color: rgba(128,128,128,0.05); padding: 15px 20px; border-left: 5px solid rgba(128,128,128,0.075) }
blockquote p { margin-bottom: 1.1em; font-size: 1em; line-height: 1.45 }
blockquote ul:last-child,blockquote ol:last-child { margin-bottom: 0 }
pre { padding: 18px; background-color: #f7f7f9; border: 1px solid #e1e1e8; display: block }
code { padding: 2px 4px; font-size: 90%; color: #c7254e; white-space: nowrap; background-color: #f9f2f4 }
.footnote { vertical-align: top; position: relative; top: -0.5em; font-size: .8em }
hr { margin: 2em 0 }
img { max-width: 100% }
pre { }
p,pre,pre.prettyprint,blockquote { margin: 0 0 1.1em }
hr { margin: 2em 0 }
img { max-width: 100% }
.sequence-diagram,.flow-chart { text-align: center; margin-bottom: 1.1em }
.sequence-diagram text,.flow-chart text { font-size: 15px !important; font-family: "Source Sans Pro", sans-serif !important }
.sequence-diagram [fill="#ffffff"],.flow-chart [fill="#ffffff"] { }
.sequence-diagram [stroke="#000000"],.flow-chart [stroke="#000000"] { }
.sequence-diagram text[stroke="#000000"],.flow-chart text[stroke="#000000"] { }
.sequence-diagram [fill="#000"],.flow-chart [fill="#000"],.sequence-diagram [fill="#000000"],.flow-chart [fill="#000000"],.sequence-diagram [fill="black"],.flow-chart [fill="black"] { }
ul,ol { margin-bottom: 1.1em }
ul ul,ol ul,ul ol,ol ol { margin-bottom: 1.1em }
kbd { padding: .1em .6em; border: 1px solid rgba(63,63,63,0.25); font-size: .7em; font-family: sans-serif; background-color: #fff; color: #333; display: inline-block; margin: 0 .1em; white-space: nowrap }
.toc ul { list-style-type: none; margin-bottom: 15px }

引用:

引用数据库创建模块

from django.db import models

创建:

在models.py中创建的每一个类都为表,类变量即为表字段,类变量赋予的值相当于字段属性。

创建的类需要继承模块方法:models.Model

字段说明:

 - 类型名称 类方法 widget 必填参数
数值型 int自增列 AutoField TextInput primary_key=True
bigint自增列 BigAutoField TextInput primary_key=True
小整数(32768~32767) SmallIntegerField TextInput  
正小整型(0~32767) PositiveSmallIntegerField TextInput  
整数(-2147483648~2147483647) IntegerField TextInput  
正整数(0~2147483647) PositiveIntegerField TextInput  
长整型(-9223372036854775808~9223372036854775807) BigIntegerField TextInput  
浮点型 FloatField TextInput  
10进制小数 DecimalField TextInput
max_digits:

小数总长度
decimal_places:小数位长度

二进制类型 BinaryField TextInput  
字符型 字符型 CharField TextInput max_length
文本类型 TextField Textarea  
Email类型(字符串) EmailField TextInput  
IP4&6类型(字符串) GenericIPAddressField TextInput  
URL类型(字符型) URLField TextInput  
字母、数字、下划线、连接符(减号) SlugField TextInput  
逗号分割的数字 CommaSeparatedIntegerField TextInput max_length
UUID类型(字符型) UUIDField TextInput  
文件型 提供读取文件夹下文件 FilePathField CharField 
path


它是一个 CharField ,它用来选择文件系统下某个目录里面的某些文件。它有三个专有的参数,只有第一个参数是必须的:

path:

这个参数是必需的。它是一个目录的绝对路径,而这个目录就是 FilePathField 用来选择文件的那个目录。比如: "/home/images"。

match:

可选参数。它是一个正则表达式字符串, FilePathField 用它来过滤文件名称,只有符合条件的文件才出现在文件选择列表中。要注意正则表达式只匹配文件名,而不是匹配文件路径。

例如:"foo.*\.txt$" 只匹配名为foo23.txt 而不匹配 bar.txt 和 foo23.gif。

recursive:

可选参数。它的值是 True 或 False。默认值是 False。它指定是否包含 path 下的子目录。

allow_files:

该项属于Django1.5新增内容。可选参数,它的值是 True 或 False。默认值是 True。它指定是否包含指定位置的文件。该项与allow_folders 必须有一个是 True。

allow_folders:

Django1.5新增内容。可选参数,它的值是True或False。默认是False。它指定是否包含指定位置的目录。该项与allow_files必须有一个是 True。

前面已经提到了 match 只匹配文件名称,而不是文件路径。所以下面这个例子:

FilePathField(path="/home/images", match="foo.*", recursive=True)?

将匹配 /home/images/foo.gif ,而不匹配 /home/images/foo/bar.gif。这是因为 match 只匹配文件名(foo.gif 和 bar.gif)。

默认情况下, FilePathField 实例在数据库中的对应列是varchar(100) 。和其他字段一样,你可以利用 max_length 参数改变字段的最大长度。

文件上传到指定目录 FileField FileInput
upload_to


class FileField(upload_to=None[, max_length=100, **options])

Note:该字段不支持primary_key和unique 参数,否则会抛出TypeError 异常。

它有一个必须的参数:

upload_to:

用于保存文件的本地文件系统。它根据 MEDIA_ROOT 设置确定该文件的 url 属性。

该路径可以包含 时间格式串strftime(),可以在上传文件的时候替换成当时日期/时间(这样,就不会出现在上传文件把某个目录塞满的情况了)。

该参数也可以是一个可调用项,比如是一个函数,可以调用函数获得包含文件名的上传路径。这个可调用项必须要接受两个参数,并且返回一个保存文件用的 Unix-Style 的路径(用/斜杠)。两个参数分别是:

instance :定义了当前 FileField 的 model 实例。更准确地说,就是以该文件为附件的 model 实例。

大多数情况下,在保存该文件时, model 实例对象还并没有保存到数据库,这是因为它很有可能使用默认的 AutoField,而此时它还没有从数据库中获得主键值。

filename :上传文件的原始名称。在生成最终路径的时候,有可能会用到它。

还有一个可选的参数:

storage:

负责保存和获取文件的对象。

默认的form widget是FileInput。

Note:在 model 中使用 FileField 或 ImageField 要按照以下的步骤:

  1. 在项目settings文件中,你要定义 MEDIA_ROOT ,将它的值设为用来存放上传文件的目录的完整路径。(基于性能的考虑,Django 没有将文件保存在数据库中),然后定义 MEDIA_URL ,将它的值设为表示该目录的网址。要确保 web 服务器所用的帐号拥有对该目录的写权限。
  2. 在 model 里面添加 FileField 或 ImageField ,并且确认已定义了 upload_to 项,让 Django 知道应该用MEDIA_ROOT的哪个子目录来保存文件。
  3. 存储在数据库当中的仅仅只是文件的路径(而且是相对于 MEDIA_ROOT 的相对路径)。你可能已经想到利用Django 提供的 url 这个方便的属性。举个例子,如果你的 ImageField 名称是 mug_shot,那么你可以在模板中使用{{ object.mug_shot.url }}?就能得到图片的完整网址。

例如,假设你的 MEDIA_ROOT 被设为 ‘/home/media‘,upload_to 被设为 ‘photos/%Y/%m/%d‘。 upload_to 中的 ‘%Y/%m/%d‘ 是一个strftime(),‘%Y‘ 是四位的年份,‘%m‘ 是两位的月份,‘%d‘ 是两位的日子。如果你在2007年01月15号上传了一个文件,那么这个文件就保存在/home/media/photos/2007/01/15 目录下。

如果你想得到上传文件的本地文件名称,文件网址或是文件的大小,你可以使用 name, url 和 size 属性。

Note:在上传文件时,要警惕保存文件的位置和文件的类型,这么做的原因是为了避免安全漏洞。对每一个上传文件都要验证,这样你才能确保上传的文件是你想要的文件。举个例子,如果你盲目地让别人上传文件,而没有对上传文件进行验证,如果保存文件的目录处于 web 服务器的根目录下,万一有人上传了一个 CGI 或是 PHP脚本,然后通过访问脚本网址来运行上传的脚本,那可就太危险了。千万不要让这样的事情发生!默认情况下,FileField 实例在数据库中的对应列是 varchar(100) ,和其他字段一样,你可以利用max_length 参数改变字段的最大长度。

图片上传到指定目录 ImageField FileInput upload_to
class ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100,**options])和FileField一样,只是会验证上传对象是不是一个合法的图象文件。除了那些在FileField中有效的参数之外, ImageField 还可以使用 File.height and File.width 两个属性 。它有两个可选参数:height_field:保存图片高度的字段名称。在保存对象时,会根据该字段设定的高度,对图片文件进行缩放转换。width_field:保存图片宽度的字段名称。在保存对象时,会根据该字段设定的宽度,对图片文件进行缩放转换。默认情况下,ImageField 实例对应着数据库中的varchar(100) 列。和其他字段一样,你可以使用max_length 参数来改变字段的最大长度。
日期型 日期型 DateField TextInput
auto_now

auto_now_add

日期时间型 DateTimeField TextInput 同DateField
时间型 TimeField TextInput 同DateField
布尔 布尔型 BooleanField CheckboxInput  
空布尔 NullBooleanField NullBooleanSelect  

参数说明:

参数名称 默认值 说明
null False 数据库中字段是否可以为空
blank   django的Admin中添加数据时是否可允许空值
primary_key  False 主键,设置后,就会代替原来的自增 id 列
auto_now    自动创建---无论添加或修改,都是当前操作的时间
auto_now_add   自动创建---永远是创建时的时间
choices   Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作

代码如下:

gf = models.IntegerField(choices=[(0, ‘何穗‘),(1, ‘大表姐‘),],default=1)?

  

default   长度
verbose_name   Admin中字段的显示名称
db_column   数据库中的字段名称
unique False 不允许重复
db_index  False 数据库索引
editable False 在Admin里是否可编辑
error_messages   自定义错误信息(字典类型),从而定制想要显示的错误信息;
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
如:{‘null‘: "不能为空.", ‘invalid‘: ‘格式错误‘}
auto_created False 自动创建
help_text   在Admin中提示帮助信息
validators   自定义错误验证(列表类型),从而定制想要的验证规则
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
#举个声明的例子如下:
test = models.CharField(
    max_length=32,
    error_messages={
        ‘c1‘: ‘优先错信息1‘,
        ‘c2‘: ‘优先错信息2‘,
        ‘c3‘: ‘优先错信息3‘,
    },
    validators=[
        RegexValidator(regex=‘root_\d+‘, message=‘错误了‘, code=‘c1‘),
        RegexValidator(regex=‘root_112233\d+‘, message=‘又错误了‘, code=‘c2‘),
        EmailValidator(message=‘又错误了‘, code=‘c3‘), ]
) 

upload-to    文件上传路径

外键说明:

一对多:models.ForeignKey(其他表)

一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)

例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。

代码:

a=models.ForeignKey(to=‘TableName‘,to_field=‘id‘)

ForeignKey的参数:

参数名称 参数说明
to=None, 要进行关联的表名
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:删除关联数据:

a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

related_name=None, 反向操作时,使用的字段名,用于代替 【表名_set】
related_query_name=None, 反向操作时,使用的连接前缀,用于替换【表名】
limit_choices_to=None, 在Admin或ModelForm中显示关联数据时,提供的条件
db_constraint=True 是否在数据库中创建外键约束
parent_link=False 在Admin中是否显示关联数据

多对多:models.ManyToManyField(其他表)

多对多:在某表中创建一行数据是,有一个可以多选的下拉框

例如:创建用户信息,需要为用户指定多个爱好

ManyToManyField参数:

参数名称 参数说明

to=None


要进行关联的表名

related_name=None 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
related_query_name=None 反向操作时,使用的连接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values(‘表名__字段名‘)
limit_choices_to=None
在Admin或ModelForm中显示关联数据时,提供的条件:
- limit_choices_to={‘nid__gt‘: 5}#
- limit_choices_to=lambda : {‘nid__gt‘: 5}

from django.db.models import Q
 - limit_choices_to=Q(nid__gt=10)
 - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
 - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption=‘root‘)?
symmetrical=None 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
through=None 自定义第三张表时,使用字段用于指定关系表
through_fields=None
自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表:

from django.db import models
class Person(models.Model):
    name=models.CharField(max_length=50)
class Group(models.Model):
    name=models.CharField(max_length=128)
    members=models.ManyToManyField(
        Person,
        through=‘Membership‘,
        through_fields=(‘group‘, ‘person‘),
        )
class Membership(models.Model):
    group=models.ForeignKey(Group, on_delete=models.CASCADE)
    person = models.ForeignKey(Person,on_delete=models.CASCADE)
    inviter=models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
        related_name="membership_invites",
        )
    invite_reason=models.CharField(max_length=64)?

  

db_constraint=True 是否在数据库中创建外键约束
db_table=None 默认创建第三张表时,数据库中表的名称

一对一:models.OneToOneField(其他表)

一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)

例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据

OneToOneField参数:

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

原文地址:https://www.cnblogs.com/hezhefly/p/8214592.html

时间: 2024-10-09 11:46:38

二、Django创建数据库模型的相关文章

Ubuntu下Django初体验(二)——创建工程及应用

一.工程目录详解 创建工程后得到如下目录: 1. manage.py 管理项目.创建数据库.启动服务器等.测试等. 查看子命令: python manage.py 启动服务器: python manage.py runserver 指定启动服务器的地址和端口: python manage.py runserver 0.0.0.0 8080 2. mysite 目录 2.1 settings.py  对于整个网站的配置.配置文件:应用.中间件.数据库.静态目录各类配置... 2.2 urls.py

Qt DLL总结【二】-创建及调用QT的 DLL(三篇)good

目录 Qt DLL总结[一]-链接库预备知识 Qt DLL总结[二]-创建及调用QT的 DLL Qt DLL总结[三]-VS2008+Qt 使用QPluginLoader访问DLL 开发环境:VS2008+Qt4.7.4 最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库. 先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数的调用

用django创建一个项目

首先你得安装好python和django,然后配置好环境变量,安装python就不说了,从配置环境变量开始 1.配置环境变量 在我的电脑处点击右键,或者打开 控制面板\系统和安全\系统 -> 左边导航栏的"高级系统设置"->环境变量 -->然后你会看到下面这个界面 -> 点击这个path,然后点编辑 然后找到C:\Python27文件夹,将这个文件夹添加进去. 2.安装django 打开cmd,执行 pip install django 或者 把 这个包下载下来

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

convirt(二)—— 创建第一台虚机

1.拷贝cms公钥到managed上,cms依赖免秘钥的root执行环境 #非默认端口,你懂的 ssh-copy-id -i ~/.ssh/id_rsa.pub "-p port_number [email protected]" 2.managed上存放iso目录,拷贝镜像存放到该目录 #目录位置和名称随意,只是模板里指定的时候需要指定好即可 mkdir /opt/iso # ls /opt/iso/ CentOS-6.4-x86_64-bin-DVD1.iso 3.增加manage

Qt DLL总结【二】-创建及调用QT的 DLL

开发环境:VS2008+Qt4.7.4 最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库. 先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法 2.显示链接DLL,调用DLL中类对象.成员函数.(通过对象即可实现类成员函数的调用) ①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用: ②用GetProcAddress直接调用. ③用Qt的QPluginLoader类直接调用生成的

爪哇国新游记之十二----线程创建的两种形式

public class Thread1 extends Thread{ public void run(){ int i=0; while(i<10){ i++; System.out.println(i); } } public static void main(String[] args){ Thread1 t=new Thread1(); t.start(); } } public class Thread2 implements Runnable{ @Override public v

C#窗体皮肤制作(二):创建窗体库项目以及最小化、最大化、关闭按钮的实现

很高兴有朋友关注这篇博客,同时也十分抱歉让关注的朋友久等了,隔上一篇博客也有3个月没有更新,主要是由于3月份辞职,4月份初离职到期离开了北京高德,来到了上海张江.目前新工作也处于熟悉当中,希望大家能体谅.刚好这周末有点时间,我就接着写写,这篇博客主要是针对初学者,希望给为他们能提供一种较易理解的窗体皮肤制作思路,记得自己当初学习C#编程的时候也是摸着石头过河. 闲话少说,我还是接着上篇博客继续写,上次说明了下如何收集图片资源,这次就以360安全卫士来做示例进行模仿,本来也想过模仿下qq,但是qq

django创建第一个项目helloworld

环境:centos 7,已安装python 3.6环境 1.安装django并创建django第一个项目 1.1.使用pip安装django# pip install Django或指定安装版本# pip install Django==1.10.5 1.2.使用django创建hello项目下面我们就来创建我们的HelloWorld项目,在你想保存项目代码的目录下执行django-admin.py startproject hello 1.3.开启服务# python hello/manage