12.324 Django ORM常用字段

1.id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
2.IntegerField:一个整数类型,范围在 -2147483648 to 2147483647
3.name = models.CharField(max_length=32):varchar字符类型,必须提供max_length参数, max_length表示字符长度
4.title = models.DateField(null=True):日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例
5.title = models.DateTimeField(null=True):日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例
6.TimeField(DateTimeCheckMixin, Field): - 时间格式 HH:MM[:ss[.uuuuuu]]
7.DurationField(Field):- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
8.TextField(Field): - 文本类型
9.FilePathField(Field): - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- 参数:
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹
10.FileField(Field): - 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
11.ImageField(FileField): - 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串)
12.FloatField(Field): - 浮点型
13.DecimalField(Field): - 10进制小数
- 参数:max_digits,总长度 decimal_places,小数位长度
14.BinaryField(Field): - 二进制类型

自定义字段:

自定义char类型字段:

class FixedCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
super().__init__(max_length=max_length, *args, **kwargs)
self.length = max_length

def db_type(self, connection):
"""
限定生成数据库表的字段类型为char,长度为length指定的值
"""
return 'char(%s)' % self.length

class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用上面自定义的char类型的字段
cname = FixedCharField(max_length=25)

自定义无符号的int类型:

class UnsignedIntegerField(models.IntegerField):
def db_type(self, connection):
return 'integer UNSIGNED' class Class(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=25)
# 使用上面自定义的无符号的int类型的字段
cid = UnsignedIntegerField()
12.325 字段参数
title = models.DateField(null=True):用于表示某个字段可以为空
title = models.DateField(unique=True):如果设置为unique=True,则该字段在此表中必须是唯一的
title = models.DateField(db_index=True):如果db_index=True,则代表着为此字段设置数据库索引
price = models.DecimalField(max_digits=5, decimal_places=2, default=9.9):为该字段设置默认值

DatetimeField、DateField、TimeField:
publisher_date = models.DateField(auto_now_add): 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库
publisher_date = models.DateField(auto_now): 配置上auto_now=True,每次更新数据记录的时候会更新该字段
12.326关系字段(ForeignKey)

外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

ForeignKey字段参数:

publisher = models.ForeignKey(to='Publisher', tofield='id' on_delete=models.CASCADE, db_constraint=False)
1.to:设置要关联的表
2.to_field:设置要关联的表的字段、
3.related_name:反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'
4.related_query_name:反向查询操作时,使用的连接前缀,用于替换表名
5.on_delete=models.CASCADE:当删除关联表中的数据时,当前表与其关联的行的行为,models.CASCADE删除关联数据,与之关联也删除(1.1版本默认级联删除,2.0版本后必须手动添加)
6.on_delete=models.SET()删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
def func():
return 10 class MyModel(models.Model):
user = models.ForeignKey(
to="User",
to_field="id",
on_delete=models.SET(func)
)
7.db_constraint:是否在数据库中设置外键约束关系,默认为True,设置成False,数据库中不体现约束关系,相当于普通字段

示例:

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")

当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

models.Classes.objects.first().student_set.all()

当我们在ForeignKey字段中添加了参数 related_name 后:

class Student(models.Model):
name = models.CharField(max_length=32)
theclass = models.ForeignKey(to="Classes", related_name="students")

当我们要查询某个班级关联的所有学生(反向查询)时,我们会这么写:

models.Classes.objects.first().students.all()
12.327OneToOneField

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

一对一的关联关系多用在当一张表的不同字段查询频次差距过大的情况下,将本可以存储在一张表的字段拆开放置在两张表中,然后将两张表建立一对一的关联关系。

class Author(models.Model):
name = models.CharField(max_length=32)
gender_choice = ((1, "男"), (2, "女"), (3, "保密"))
gender = models.SmallIntegerField(choices=gender_choice, default=3)
info = models.OneToOneField(to='AuthorInfo') class AuthorInfo(models.Model):
phone = models.CharField(max_length=11)
email = models.EmailField(unique=True, db_index=True)
1.to:设置要关联的表
2.to_field:设置要关联的字段
3.on_delete:同ForeignKey字段
12.328ManyToManyField

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

多对多关联关系的三种方式:

方式一:自行创建第三张表

class Book(models.Model):
title = models.CharField(max_length=32,verbose_name="书名")

class Author(models.Model):
name = models.CharField(max_length=32,verbose_name="作者姓名")

# 自己创建第三张表
class Book2Author(models.Model):
id = models.AutoField(primary_key=True)
book = models.ForeignKey(to="Book")
author = models.ForeignKey(to="Author")
#first_blood = models.DateField() 自行创建第三章表,便于增加新字段
class Meta:
unique_together = ("author", "book")
1.unique_together:联合唯一索引
2.index_together:联合索引
3.ordering:指定默认按什么字段排序。只有设置了该属性,查询到的结果才可以被reverse()

方式二:通过ManyToManyField自动创建第三张表

class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="书名") # 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", db_table="author2book",related_name="authors")
class Meta:
db_table = "author"
1.to:设置要关联的表
2.db_table="author2book":指定自动创建的第三张表的表名为author2book,而不是app01_author_book
3.related_name="authors":反向操作时,使用的字段名,用于代替原反向查询时的'表名_set',同ForeignKey字段
4.Meta:db_table,创建author表时指定表名为author,而不是app01_author

方式三:设置ManyTomanyField并指定自行创建的第三张表

class Book(models.Model):
title = models.CharField(max_length=32,verbose_name="书名")

class Author(models.Model):
name = models.CharField(max_length=32,verbose_name="作者姓名")
books = models.ManyToManyField(
to="Book",
through="Book2Author",
through_fields=('author', 'book')
) # 自己创建第三张表
class Book2Author(models.Model):
id = models.AutoField(primary_key=True)
book = models.ForeignKey(to="Book")
author = models.ForeignKey(to="Author")
#first_blood = models.DateField() 自行创建第三章表,便于增加新字段
class Meta:
unique_together = ("author", "book")
1.to:设置要关联的表
2.through_fields:设置关联的字段,接受一个2元组('field1','field2'):其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名,表示第三张表author,book字段是描述多对多关系的,其他的字段的ForeignKey是单纯的多对一外键。
3.through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。

注意:

但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,只能使用all方法拿到对象,需要通过第三张表的model来管理多对多关系。

12.3281使用方式一或方式三的查询和其他操作

查询操作:

# 找到第一本书
ret = models.Book.objects.first().author2book_set.all().values("author__name")
ret = models.Book.objects.filter(id=1).values("author2book__author__name")

增删改操作:

first_book = models.Book.objects.first()
# 改:first_book.author.add(1):
models.Author2Book.objects.create(book=first_book, author_id=1)
# 清空:first_book.author.clear()
models.Author2Book.objects.filter(book=first_book).delete()
# 删除:first_book.author.remove(3)
models.Author2Book.objects.filter(book=first_book, author_id=3).delete()
# 查:first_book.author.all() 方式三可用
models.Author2Book.objects.filter(book=first_book)

python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)的更多相关文章

  1. Django框架ORM常用字段汇总_模型层

    与数据类型相关的字段 CharField 作用:字符串字段, 用于较短的字符串. 参数:CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许 ...

  2. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  3. Django框架ORM常用参数汇总_模型层

    primary_key 如果为True,那么这个字段就是模型的主键. 如果你没有指定任何一个字段的primary_key=True, Django就会自动添加一个IntegerField字段做为主键, ...

  4. Django的ORM常用查询操作总结(Django编程-3)

    Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...

  5. Python的Django框架中forms表单类的使用方法详解

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  6. Python的Django框架中的Cookie相关处理

    Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...

  7. Python的Django框架中的Context使用

    Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...

  8. 如何使用Python的Django框架创建自己的网站

    如何使用Python的Django框架创建自己的网站 Django建站主要分四步:1.创建Django项目,2.将网页模板移植到Django项目中,3.数据交互,4.数据库 1创建Django项目 本 ...

  9. 将Python的Django框架与认证系统整合的方法

    将Python的Django框架与认证系统整合的方法 这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下 将Django ...

随机推荐

  1. asp.net大附件上传,支持断点续传

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传  ...

  2. libreoj #10153 树形dp

    $des$ 有一棵二叉苹果树,如果数字有分叉,一定是分两叉,即没有只有一个儿子的节点.这棵树共 NNN 个节点,标号 1 至 N,树根编号一定为 1. 我们用一根树枝两端连接的节点编号描述一根树枝的位 ...

  3. Uncaught SyntaxError: Unexpected token o

    浏览器报Uncaught SyntaxError: Unexpected token o 这原因是你ajax获取数据的时候对数据进行错误操作,比如使用了 JSON.parse(data) 对数据进行转 ...

  4. Echarts 入门操作

    Echarts具有丰富的图表,可以说是数据可视化的神器: 1.下载Echarts 到官网或者点击以下文字[下载Echarts]即可下载: ①官网下载地址:https://echarts.baidu.c ...

  5. ICEM-缺口圆柱

    原视频下载地址:https://pan.baidu.com/s/1bpahxd9 密码: bpp7

  6. SDN阅读作业

    阅读文章<软件定义网络(SDN)研究进展>,并根据所阅读的文章,书写一篇博客,回答以下问题(至少3个): 1.为什么需要SDN?SDN特点? 随着网络规模的不断扩大,传统网络设备繁复的协议 ...

  7. Swarm容器集群管理(超详细)

    一.Swarm介绍 Swarm是Docker公司自研发的容器集群管理系统, Swarm在早期是作为一个独立服务存在, 在Docker Engine v1.12中集成了Swarm的集群管理和编排功能.可 ...

  8. docker_概念

    为什么有docker? 1. 宿主机可以虚拟一个硬件平台:其上会有内核(在虚拟机上的操作系统),内核负责资源调度和通信:内核之上会有用户态,运行在用户态(用户空间)之上多是应用程序,也就是进程.硬件( ...

  9. SpringBoot dev-tools vjtools dozer热启动类加载器不相同问题

    最近使用唯品会的vjtools的BeanMapper进行对象的深度克隆转换DTO/VO这种操作,Spring Boot的dev-tools热启动,需要把vjtools和dozer包都放到spring- ...

  10. spring AOP的使用步骤

    Spring AOP定义及术语:https://www.cnblogs.com/wangcp-2014/p/11544674.html spring AOP的使用,分三个步骤,记住这三个步骤,AOP就 ...