ORM

数据库与ORM映射关系
表名 --- 类名
字段 --- 属性
表记录 --- 类示例对象

创建表(建立模型)

  模型建立如下

class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=6, decimal_places=2)create_time = models.DateTimeField()memo = models.CharField(max_length=32, default="")#与publish建立一对多的关系,外键字段建立在多的一方publish = models.ForeignKey(to="Publish", default=1)#与author表建立多对多的关系,ManyToManyField可以建立在两个模型中的任意一个,自动创建第三张表author = models.ManyToManyField("Author")def __str__(self):return self.titleclass Publish(models.Model):name = models.CharField(max_length=32)email = models.CharField(max_length=32)class Author(models.Model):name = models.CharField(max_length=32)def __str__(self):return self.name

  通过logging可以查看翻译成的sql语句

LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}
}  

View Code

  注意事项

1、 表的名称myapp_modelName,是根据 模型中的元数据自动生成的,也可以覆写为别的名称  2、id 字段是自动添加的3、对于外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名4、这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据settings 中指定的数据库类型来使用相应的SQL 语句。5、定义好模型之后,你需要告诉Django _使用_这些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中设置,在其中添加models.py所在应用的名称。6、外键字段 ForeignKey 有一个 null=True 的设置(它允许外键接受空值 NULL),你可以赋给它空值 None 

View Code

常用字段和参数

常用字段

AutoField

  int自增列,必须填入参数primary_key=true,当model中如果没有自增列,则自动会创建一个列名为id的列

IntegerField

  一个整数类型,范围在-2147483648 to 2147483647

CharField

  字符类型,必须提供max_length参数,表示字符长度

DateField

  日期字段,日期格式YYYY-MM-DD,相当于python中的datetime.date()实例

DateTimeField

  日期时间字段,格式YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于python中的datetime.datetime实例

字段合集

   AutoField(Field)- int自增列,必须填入参数 primary_key=TrueBigAutoField(AutoField)- bigint自增列,必须填入参数 primary_key=True注:当model中如果没有自增列,则自动会创建一个列名为id的列from django.db import modelsclass UserInfo(models.Model):# 自动创建一个列名为id的且为自增的整数列username = models.CharField(max_length=32)class Group(models.Model):# 自定义自增列nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)SmallIntegerField(IntegerField):- 小整数 -32768 ~ 32767PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正小整数 0 ~ 32767IntegerField(Field)- 整数列(有符号的) -2147483648 ~ 2147483647PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整数 0 ~ 2147483647BigIntegerField(IntegerField):- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807BooleanField(Field)- 布尔值类型NullBooleanField(Field):- 可以为空的布尔值CharField(Field)- 字符类型- 必须提供max_length参数, max_length表示字符长度TextField(Field)- 文本类型EmailField(CharField):- 字符串类型,Django Admin以及ModelForm中提供验证机制IPAddressField(Field)- 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制GenericIPAddressField(Field)- 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6- 参数:protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"URLField(CharField)- 字符串类型,Django Admin以及ModelForm中提供验证 URLSlugField(CharField)- 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)CommaSeparatedIntegerField(CharField)- 字符串类型,格式必须为逗号分割的数字UUIDField(Field)- 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证FilePathField(Field)- 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能- 参数:path,                      文件夹路径match=None,                正则匹配recursive=False,           递归下面的文件夹allow_files=True,          允许文件allow_folders=False,       允许文件夹FileField(Field)- 字符串,路径保存在数据库,文件上传到指定目录- 参数:upload_to = ""      上传文件的保存路径storage = None      存储组件,默认django.core.files.storage.FileSystemStorageImageField(FileField)- 字符串,路径保存在数据库,文件上传到指定目录- 参数:upload_to = ""      上传文件的保存路径storage = None      存储组件,默认django.core.files.storage.FileSystemStoragewidth_field=None,   上传图片的高度保存的数据库字段名(字符串)height_field=None   上传图片的宽度保存的数据库字段名(字符串)DateTimeField(DateField)- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]DateField(DateTimeCheckMixin, Field)- 日期格式      YYYY-MM-DDTimeField(DateTimeCheckMixin, Field)- 时间格式      HH:MM[:ss[.uuuuuu]]DurationField(Field)- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型FloatField(Field)- 浮点型DecimalField(Field)- 10进制小数- 参数:max_digits,小数总长度decimal_places,小数位长度BinaryField(Field)- 二进制类型

class FixedCharField(models.Field):"""自定义的char类型的字段类"""def __init__(self, max_length, *args, **kwargs):self.max_length = max_lengthsuper(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)def db_type(self, connection):"""限定生成数据库表的字段类型为char,长度为max_length指定的值"""return 'char(%s)' % self.max_lengthclass Class(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=25)# 使用自定义的char类型的字段cname = FixedCharField(max_length=25)

自定义字段

'AutoField': 'integer AUTO_INCREMENT','BigAutoField': 'bigint AUTO_INCREMENT','BinaryField': 'longblob','BooleanField': 'bool','CharField': 'varchar(%(max_length)s)','CommaSeparatedIntegerField': 'varchar(%(max_length)s)','DateField': 'date','DateTimeField': 'datetime','DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)','DurationField': 'bigint','FileField': 'varchar(%(max_length)s)','FilePathField': 'varchar(%(max_length)s)','FloatField': 'double precision','IntegerField': 'integer','BigIntegerField': 'bigint','IPAddressField': 'char(15)','GenericIPAddressField': 'char(39)','NullBooleanField': 'bool','OneToOneField': 'integer','PositiveIntegerField': 'integer UNSIGNED','PositiveSmallIntegerField': 'smallint UNSIGNED','SlugField': 'varchar(%(max_length)s)','SmallIntegerField': 'smallint','TextField': 'longtext','TimeField': 'time','UUIDField': 'char(32)',

ORM字段与数据库字段的对应关系

字段参数

null

  用于表示某个字段可以为空

unique

  表示该字段在表中必须是唯一的

db_index

  表示为此字段设置索引

default

  为该字段设置默认值

DateField和DateTimeField

  对于auto_now和auto_now_add,两者默认值都为False

  auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库

  auto_now=true,每次更新数据记录的时候会更新该字段

关系字段

ForeignKey

  外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在'一对多'中多的一方

字段参数

  to:设置要关联的表

  to_field:设置要关联的表的字段

  related_name:反向查询时,使用的字段名,用于代替反向查询时的'表名_set'

class Classes(models.Model):name = models.CharField(max_length=32)class Student(models.Model):name = models.CharField(max_length=32)theclass = models.ForeignKey(to="Classes", related_name="students")#当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写
models.Classes.objects.first().students.all()

  related_query_name:反向查询操作时,使用的连接前缀,用于替换表名

  on_delete:当删除关联表中的数据时,当前表与其关联的行的行为

models.CASCADE
删除关联数据,与之关联也删除models.DO_NOTHING
删除关联数据,引发错误IntegrityErrormodels.PROTECT
删除关联数据,引发错误ProtectedErrormodels.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)models.SET
删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

View Code

def func():return 10class MyModel(models.Model):user = models.ForeignKey(to="User",to_field="id",on_delete=models.SET(func))

View Code

  db_constraint:是否在数据库中创建外键约束,默认为True

OneToOneField

  通常一对一字段用来扩展已有字段

  字段参数

  to:设置要关联的表

  to_field:设置要关联的字段

  on_delete:同ForeignKey字段

ManyToManyField

  表示多对多的关联关系,在数据库中通过第三张表来建立关联关系

  字段参数

  to:设置要关联的表

  related_name:同ForeignKey字段

  related_query_name:同ForeignKey字段

  symmetrical:仅用于多对多自关联时,指定内部是否创建反向操作的字段,默认为True

class Person(models.Model):name = models.CharField(max_length=16)friends = models.ManyToManyField("self", symmetrical=False)#person对象现在就可以使用person_set属性进行反向查询

View Code

  through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系,但也可以手动创建第三张表,此时就需要通过through来指定第三张表名

  through_fields:设置关联的字段

  db_table:默认创建第三张时,数据库中表的名称

元信息

ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:db_table:ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名index_together:联合索引unique_together:联合唯一索引ordering:指定默认按什么字段排序。只有设置了该属性,我们查询到的结果才可以被reverse()

View Code

转载于:https://www.cnblogs.com/iamluoli/p/8881057.html

Django中ORM之创建模型相关推荐

  1. Django 中ORM 的使用

    一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={'def ...

  2. django 模板mysql_59 Django基础三件套 , 模板{{}}语言 , 程序连mysql Django项目app Django中ORM的使用...

    主要内容:https://www.cnblogs.com/liwenzhou/p/8688919.html 1 form表单中提交数据的三要素 a : form标签必须要有action和method的 ...

  3. 西游之路——python全栈——django中orm的使用(1)

    目录 首先推荐两篇文章:Django之ORM操作,http://www.cnblogs.com/yuanchenqi/articles/6083427.html十分全面. 另外和python---OR ...

  4. Django中ORM操作

    一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. ​ 简单的说,ORM是通过使用描述对象 ...

  5. Django中ORM的具体使用,超全超长超好懂

    一.django字段和字段参数介绍 class Book(models.Model):# 如果不写id,会默认一个id,并且自增#primary_key=True 表示该字段是主键,一个表中只能由一个 ...

  6. Django中ORM中queryset方法详解

    1.queryset的含义 queryset是查询集,就是传到服务器上的url里面的查询内容.Django会对查询返回的结果集QuerySet进行缓存,这是为了提高查询效率.也就是说,在你创建一个Qu ...

  7. Django中ORM之或语句查询

    比如数据库表中有显示器1和显示器2,那么如何在django中模糊查询出显示器1和显示器2呢 首先导入模块 from django.db.models import Qclass GetDisplay( ...

  8. Django:模型层ORM,创建模型类,字段类型

    官方文档:https://docs.djangoproject.com/zh-hans/3.2/ref/models/fields/ # models.py from django.db import ...

  9. Django中ORM常用字段类型及参数

    常用字段: <1> CharField 字符串字段, 用于较短的字符串. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的 ...

  10. django orm_Django ORM简介

    django orm 您可能听说过Django ,它是Python Web框架,用于"有期限的完美主义者". 就是那个可爱的小马 . Django最强大的功能之一是其对象关系映射器 ...

最新文章

  1. 利用JNI技术在Android中调用C++代码
  2. 科技部向全社会征集颠覆性技术研发方向
  3. 新人工智能算法速度无极限
  4. CodeForces - 981G Magic multisets
  5. Oracle----date
  6. python各种语言间时间的转化
  7. 程序员,你还在 Select * 吗?
  8. Theano中的Function
  9. 逆天了!小米将首发一亿像素手机
  10. jquery 图片无缝切换
  11. python数据处理源代码_python数据分析与应用源数据和代码
  12. 仿微信图片编辑 全网功能最全的图片编辑器
  13. Spring学习:通过黎活明视频1
  14. 乐得瑞LDR6282B 支持双C口盲插便携显示器驱动板方案
  15. int和Interger区别
  16. 什么是大小端,如何写程序判断大小端?
  17. 设计模式学习难度系数排名
  18. C# 电脑麦克风录音
  19. SQL面试题 (一)
  20. Linux服务器上部署项目以及问题记录

热门文章

  1. org.apache.jasper.JasperException: /index.jsp(14,2) The s:form tag declares that it accepts dyna
  2. 程序设计_猫老鼠主人
  3. frameset框架如何使左边页面显示,隐藏?wj-wangjun
  4. 067 Pytohn文件的两种用途
  5. vue事件.navtive 的使用
  6. 陌上花开(三维偏序)(cdq分治)
  7. Eureka 注册中心 简单搭建
  8. AtCoder ARC 076D - Built?
  9. nginx 502 .sock failed (11: Resource temporarily unavailable) while connecting to upstream
  10. Android 使用库项目时的一个特殊tip