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. Python爬虫 | re正则表达式解析html页面

    正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式通常被用来匹配.检索.替换和 ...

  2. ERP study

  3. [USACO09DEC] Dizzy Cows 拓扑序

    [USACO09DEC] Dizzy Cows 拓扑序 先对有向边跑拓扑排序,记录下每个点拓扑序,为了使最后的图不存在环,加入的\(p2\)条无向边\(u,v\)必须满足\(u\)拓扑序小于\(v\) ...

  4. sdcf day4 qaq模拟赛总结

    目录 链接 总结 链接 点这里,O(∩_∩)O~ 总结 我还是太菜了,第二题提交了\(8\)遍,真心无语了 总结来看 一是思维能力弱,第二个思维题想了很长时间,想不出来 二是代码能力弱,尽管代码短,但 ...

  5. 55、Spark Streaming:updateStateByKey以及基于缓存的实时wordcount程序

    一.updateStateByKey 1.概述 SparkStreaming 7*24 小时不间断的运行,有时需要管理一些状态,比如wordCount,每个batch的数据不是独立的而是需要累加的,这 ...

  6. git sh.exe 乱码

    其实很简单,只需要在 git 安装目录中的 etc 目录下修改 bash.bashrc 文件. 在该文件头部加入: export LANG=zh_CN.utf-8alias ls='ls --show ...

  7. fluent meshing建立周期性网格

    原视频下载地址:https://pan.baidu.com/s/1pKUXKgz 密码: 6pwh

  8. 地址栏从url输入到页面显示

    本文链接:https://blog.csdn.net/MiemieWan/article/details/85708052地址栏输入url, 要通过dns解析(浏览器是不能识别url地址的,需解析成i ...

  9. compass和paoding分词器的基本使用

    1.实现搜索的技术: 数据库查询:like查询:lucene全文检索技术: 1)在数据量比较大,查询字段比较多的情况下,如果采用数据库like sql查询,性能比较差:采用lucene来查询,性能相对 ...

  10. NGINX心跳检测

    NGINX心跳检测 upstream springboot { server 10.3.73.223:8080 max_fails=2 fail_timeout=30s; server 10.3.73 ...