ORM字段

orm常见字段

https://www.cnblogs.com/liuqingzheng/articles/9627915.html

choice字段注释与数据渲染

性别

sex_choices =(
(1,'male')
(2,'female'),
(3,'null')
)
sex = models.IntegerField("上课纪录", choices=sex_choices, default="3") user_obj = models.Userinfo.objects.all().first()
# 针对choices字段,如果你想要获取数字所对应的中文,你不能直接点字段
# 固定句式,数据对象.get_字段名_display(),当没有对应关系的时候,该句式获取到的还是数字
print(user_obj.get_sex_display())

自定义字段

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

modles基表

modles里面的表有公共字段,可以提取到基表上

基表注意

设置内嵌meta类的abstract为True,默认为False(为False会创建这个表)

is_delete字段

用来做逻辑删除,因为数据是有价值的

class BaseModel(models.Model):
is_delete = models.BooleanField(default=False)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
# 基表必须设置abstract,基表就是给普通Model类继承使用的,设置了abstract就不会完成数据库迁移完成建表
abstract = True

自关联

自关联表设计

模型类中设置:null=True,表示数据库创建时该字段可不填,用NULL填充.即在Null字段显示为YES。

模型类中设置:blank=True,表示代码中创建数据库记录时该字段可传空白(空串,空字符串).表示你的表单填写该字段的时候可以不填,但是对数据库来说,没有任何影响

class AddressInfo(models.Model):
address = models.CharField(max_length=200, null=True, blank=True, verbose="地址")
pid = models.ForeignKey('self', null=True, blank=True, verbose_name="自关联")

Models去物理外键为逻辑外键

断关联的特点

1.表之间没有物理外键关联,但是有逻辑外键关联(但是要注意,由于没有物理的约束,所以要在逻辑上必须保证数据操作的安全)

2、断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(因为少做了一步判断外键数据是否存在的操作)

db_constraint

断关联,但是级联关系还在(默认级联删除),所以要自己设置,如下

db_constraint=False

on_delete--级联删除

在django1.x中默认有,2.x中必须自己实现

on_delete=models.CASCADE

#有6种操作
CASCADE:将定义有外键的模型对象同时删除(默认)
PROTECT:阻止上面的删除操作,但是会弹出ProtectedError异常
SET_NULL:将外键字段设为null,只有当字段设置了null=True时,才可以使用
SET_DEFAULT:将外键字段设为默认值,只有当字段设置了default参数时,可以使用
DO_NOTHING:什么也不做
SET():设置为一个传递给SET()的值,或者一个回调函数的返回值。注意大小写。

注意多对多例外

1.多对多外键实际在关系表中,ORM默认关系表中两个外键都是级联

2.ManyToManyField字段不提供设置on_delete,如果想设置关系表级联,只能手动定义关系表

作者没了,详情也没:on_delete=models.CASCADE
出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING #下面两个比较类似
部门没了,员工没有部门(空不能):null=True, on_delete=models.SET_NULL
部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT

related_name

外键字段为正向查询字段,related_name是反向查询字段

obj = models.Author.objects.filter(pk=1).first()
print(obj.detail.mobile)
obj2 = models.AuthorDetail.objects.filter(pk=1).first()
print(obj2.author.name)

only与defer

# 惰性查询
# res = models.Book.objects.all()
# res = models.Book.objects.values('title')
# res = models.Book.objects.only('title')
# for r in res:
# # print(r.title)
# print(r.price)#除了title,查询其他数据都要重新查询
"""
only会将括号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库
一旦你点了不是括号内的字段 就会频繁的去走数据库查询
""" # res = models.Book.objects.defer('title') # defer和only互为反关系,除了id
# for r in res:
# print(r.title)
"""
defer会将括号内的字段排除之外将其他字段对应的值 直接封装到返回给你的对象中 点该其他字段 不需要再走数据库
一旦你点了括号内的字段 就会频繁的去走数据库查询
"""

select_related和prefetch_related

# prefetch_related
res = models.Book.objects.prefetch_related('publish')
# print(res)
for r in res:
print(r.publish.name) """
prefetch_related 看似连表操作 其实是类似于子查询
prefetch_related括号内只能放外键字段
并且多对多字段不能放 如果括号内外键字段所关联的表中还有外键字段 还可以继续连表
select_related(外键字段__外键字段__外键字段...)

注意

如果你使用的是django2.X版本 你在建数据库表关系的时候
你需要手动指定两个参数
(你要手动告诉django 级联更新 级联删除 是否建外键约束) on_delete
db_constraint

django中如何开启事务

from django.db import transaction
with transaction.atomic():
# 在该代码块中所写的orm语句 同属于一个事务
缩进出来之后自动结束

Django-orm高级的更多相关文章

  1. django orm高级查询 F表达式和Q表达式以及分组annotate

    1.关联关系映射及查询1.1django默认开启延迟加载所有多对1和1对1如果不使用select_related(),需要会延迟加载获取到相关对象,因为延迟可能会造成n+1次查询的问题,所以便有了se ...

  2. 建立一个更高级别的查询 API:正确使用Django ORM 的方式(转)

    add by zhj: 本文作者是DabApps公司的技术主管,作者认为在view中直接使用Django提供的ORM查询方法是不好的,我对此并不赞同,可能作者 写这篇文章是给Django的初学者看,所 ...

  3. django orm 操作表

    django orm 操作表 1.基本操作 增 models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs inser ...

  4. [oldboy-django][2深入django]ORM操作

    推荐学习博客:http://www.cnblogs.com/wupeiqi/articles/6216618.html 需求: 汇总django orm操作,代替原生mysql语句来操作数据库:里面内 ...

  5. Django ORM models操作

    title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...

  6. django orm 基本

    1 modle基本数据类型 class Test(models.Model): """测试学习用""" Auto = models.Auto ...

  7. django orm总结[转载]

    django orm总结[转载] 转载地址: http://www.cnblogs.com/linjiqin/archive/2014/07/01/3817954.html 目录1.1.1 生成查询1 ...

  8. Django ORM - 001 - 外键表查询主表信息

    开始用Django做web开发,我想大家都会遇到同样的问题,那就是如何高效快速的查询需要的数据,MVC都很简单,但是ORM折腾起来就有些费时间,我准备好好研究下Django ORM,所以会有一个系列的 ...

  9. Django ORM 中的批量操作

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...

  10. Django ORM 查询管理器

    Django ORM 查询管理器 ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言 ...

随机推荐

  1. 【Java】简体中文、繁体中文转换

    项目中用到繁体中文语言适配,目前已经有开源的框架可以将简体中文转换成繁体中文,在此基础上封装了一个工具类,可以直接将简体中文的strings.xml转换成繁体中文的strings.xml. 引用Jar ...

  2. Web Service 接口测试

    Web Service 接口测试 Web service 概念 Web service使用与平台和编程语言无关的方式进行通讯的一项技术, web service 是一个接口, 他描述了一组可以在网络上 ...

  3. Django之 数据库ORM

    一.ORM Django的 业务 少不了 跟数据库打交道,不然没有数据库保存一些数据将是一件很糟糕的事情.Django 对 数据库 支持原生的 SQL语句,但更好的对数据库支持,Django自己有一套 ...

  4. Rust中的错误处理

    Result & Panic 这次讲得详细,从错误的来历及简写过程, 都写明白了, 先浅,再深,先深,再浅, 反复之, 学习王道~ use std::fs::File; //use std:: ...

  5. 每天一套题打卡|河南省第七届ACM/ICPC

    A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][ ...

  6. js闭包和原型链好文

    http://www.cnblogs.com/wangfupeng1988/p/3977924.html

  7. sqlalchemy(2)

    orm介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...

  8. 20180706模拟赛T3——神经衰弱

    文件名: card 题目类型: 传统题 时间限制: 1秒 内存限制: 128MB 编译优化: 无 题目描述 天然少女小雪非常喜欢玩一个叫做神经衰弱的游戏. 游戏规则是,有若干种牌,每种牌有若干对,开始 ...

  9. FastDfs的搭建

    一.什么是FastDFS FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用Fast ...

  10. 接口测试Post和Get区别(面试题)

    1. HTTP接口传递数据最常用的方式: Get方式是从服务器上获取数据:在做数据查询时,建议用Get方式:如:商品信息接口.搜索接口.博客访客接口等. Post方式是向服务器传送数据 :在做数据添加 ...