python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)
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常用字段和字段参数、关系字段和和字段参数)的更多相关文章
- Django框架ORM常用字段汇总_模型层
与数据类型相关的字段 CharField 作用:字符串字段, 用于较短的字符串. 参数:CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许 ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- Django框架ORM常用参数汇总_模型层
primary_key 如果为True,那么这个字段就是模型的主键. 如果你没有指定任何一个字段的primary_key=True, Django就会自动添加一个IntegerField字段做为主键, ...
- Django的ORM常用查询操作总结(Django编程-3)
Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...
- Python的Django框架中forms表单类的使用方法详解
用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...
- Python的Django框架中的Cookie相关处理
Python的Django框架中的Cookie相关处理 浏览器的开发人员在非常早的时候就已经意识到. HTTP's 的无状态会对Web开发人员带来非常大的问题,于是(cookies)应运而生. coo ...
- Python的Django框架中的Context使用
Python的Django框架中的Context使用 近期整理些Python方面的知识,一旦你创建一个 Template 对象,你能够用 context 来传递数据给它. 一个context是一系列变 ...
- 如何使用Python的Django框架创建自己的网站
如何使用Python的Django框架创建自己的网站 Django建站主要分四步:1.创建Django项目,2.将网页模板移植到Django项目中,3.数据交互,4.数据库 1创建Django项目 本 ...
- 将Python的Django框架与认证系统整合的方法
将Python的Django框架与认证系统整合的方法 这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下 将Django ...
随机推荐
- 使用merge-graphql-schemas 进行graphql schema 以及resovler 合并
merge-graphql-schemas 是一个方便的工具,可以进行schema 以及resovler 的合并处理 一个schema 合并参考demo schema 定义 // ./graphql/ ...
- 2019-8-26 LinkedHashMap 转 List [java.util.LinkedHashMap cannot be cast to com.zq.dataservice.bean.Index]
java.util.LinkedHashMap cannot be cast to com.zq.dataservice.bean.Index 上述错误是在做一个趋势投资demo时遇到的. 说的是链式 ...
- JavaScript对象及面向对象
1.创建对象(1)自定义对象 语法:var 对象名称=new Object();(2)内置对象 String(字符串)对象. Date(对象)对象 Array(数组)对象 Boll ...
- 【AtCoder】 ARC 103
link C-//// 直接算会出现奇偶两组选了同一个数,注意处理一下就行 #include<bits/stdc++.h> #define ll long long #define dbg ...
- 【POJ2965】The Pilots Brothers' refrigerator
题目传送门 本题知识点:深度优先搜索 + 暴力枚举 + 回溯 + 栈 如果对以上知识点还不熟悉的同学建议先做做 POJ1753 (本题是1753的提高版)(附 POJ1753博客) 以下默认您已ACP ...
- 仿站技术——获取和使用某些网站的iconfont图标字体
前言: 很多前端新手在仿一些大型网站的时候经常遇到一个问题:该网站使用了图标字体——iconfont,虽然现在阿里有开源的iconfont库,但是还是没有原网站的效果(本人强迫症但非处女座).所以此文 ...
- Linux设置开机挂载
Linux可不可以在开机的时候就将我们要的文件系统都挂载好?这样就不需要每次进入Linux系统还要挂载一次.当然可以,那就直接到/etc/fstab里面去修改. 系统挂载的一些限制: - 根目录/是必 ...
- 游标_oracle
https://blog.csdn.net/weixin_41367660/article/details/80449032
- bat批处理 取得当前路径 %CD%
在DOS的批处理中,有时候需要知道当前的路径.在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0. 这两个变量的用法和代表的内容一般是不同的. 1. %cd% 可以用在批 ...
- Redis自定义fastJson Serializer
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { public static fi ...