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. 谈谈JavaScript Navigator 对象属性

    Navigator 对象属性 可以在Navigator对象上使用以下属性: 属性 描述 appCodeName 返回浏览器的代码名称 appName 返回浏览器的名称 appVersion 返回浏览器 ...

  2. global对象,数据存储方式和检测,包装器对象等

    1.理解global对象 global对象是作为 window 对象的一部分实现的,我们无法通过代码访问到 global 对象. 我们平时在全局环境下定义的内容(变量,函数,常量等等)都是作为 glo ...

  3. Spring Cloud Netflix之Eureka服务消费者

    Eureka服务消费者介绍 Eureka服务消费者用于发现服务和消费服务,发现服务通过Eureka Client完成,消费服务通过Ribbon完成,以实现负载均衡.在实际项目中,一个服务往往同时是服务 ...

  4. The listener supports no services oracle注册监听

    问题登场: [oracle@my-e450 ~]$ lsnrctl status …… The listener supports no servicesThe command completed s ...

  5. day04 作业

    一.简述Python的五大数据类型的作用.定义方式.使用方法: 数字类型 整型 作用:描述年龄 定义方式: x = 10 y = int('10') 使用方法: + - * / % // ** 如果需 ...

  6. angular6 表单验证

    这里使用的是模型驱动的表单 1.app.module.ts import { ReactiveFormsModule } from '@angular/forms'; @NgModule({ ... ...

  7. linux 进程通信之 mmap

    一,管道PIPE 二,FIFO通信 三,mmap通信 创建内存映射区. #include <sys/mman.h> void *mmap(void *addr, size_t length ...

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

    A 表达式求值 表达式求值:可以用递归求解,也可以用栈模拟,考过多次. 类似题目:NYOJ305,NYOJ35 用栈模拟做法: #include <stdio.h> #include &l ...

  9. DNS解惑之基本概念(1)

    常见问题 1.域名对应的IP地址修改完要将近一天的时间才能有效果? DNS的数据库通常是在跑在DNS服务器的内存当中的,但是我们如果临时增加一条的话其实是写到了硬盘当中,当数据库服务刷新的时候新增的新 ...

  10. 莫烦TensorFlow_10 过拟合

    import tensorflow as tf from sklearn.datasets import load_digits from sklearn.cross_validation impor ...