doraemon的python ORM必会操作(国庆大更新)

### 11.9 ORM的字段和参数

```python
AutoField  主键
IntegerField    整数
CharField    字符串
BoolleanField  布尔值
DateTimeField DateField  日期时间
    auto_now_add=True  #新增数据的时候回自动保存当前的时间
    auto_now=True    #新增、修改数据的时候回自动保存当前的时间
DecimalField  十进制的小数
    max_digits   小数总长度
    decimal_place   小数长度
```

参数:

- null   数据库中字段是否可以为空
- blank=True  form表当填写的时候可以为空
- default  字段的默认值
- db_index  创建索引
- unipue  唯一
- choices=((0,‘女‘),(1,‘男‘))   可填写的内容和提示

表的参数

```python
#是放在app01中models中,class Xxx中的一个子类,规定表的属性
class Meta:
    db_table = "person"  #表名
    verbose_name = "个人信息"
    verbose_name_plural = "个人信息"
    index_together = [
        ("name","age"),   # 应该为两个存在的字段
    ]
    unique_together = (("name","age",))   #应该为两个存在的字段
```

#### 11.9.1 必知必会13条

ORM的13条基本命令:

- 获取所有数据------->对象列表
  - ret = models.Person.objects.all()
- 获取一个满足条件的数据
  - ret = models.Person.objects.aget()
- 获取满足条件的所有数据
  - ret = models.Person.objects.filter()
- 获取不满足条件的所有数据
  - ret = models.Person.objects.exclude()
- 拿到对象的所有字段和字段的值
  - ret = models.Person.objects.values()
- 拿到对象指定的字段和字段的值
  - ret = models.Person.objects.values(‘字段‘)
- 排序
  - ret = models.Person.objects.all().order_by(‘id‘)
- 反向排序
  - ret = models.Person.objects.all().reverse()
- 去重
  - ret = models.Person.objects.values(‘age‘).distinct()
- 计数
  - ret = models.Person.objects.all().count()
- 取第一个元素 没有元素就是None
  - ret = models.Person.objects.filter(pk=1).values().first()
- 取最后一个元素
  - ret = models.Person.objects.filter(pk=1).values().last()
- 查询的数据是否存在
  - ret = models.Person.objects.filter(pk=1).exists()

#### 11.9.2 单表的双下划线

- ret = models.Person.objects.filter(pk__gt=1)    gt  greater than 大于
- ret = models.Person.objects.filter(pk__lt=1)   lt less than 小于
- ret = models.Person.objects.filter(pk__gte=1)   gte  greater than equal 大于等于
- ret = models.Person.objects.filter(pk__lte=1)   gte  less than equal  小于等于
- ret = models.Person.objects.filter(pk__range=[2,3])  #范围 包括头和尾
- ret = models.Person.objects.filter(pk__in=[2,3,100])   成员判断
- ret = models.Person.objects.filter(name__contains=‘A‘)  判断是否有A的内容
- ret = models.Person.objects.filter(name__icontains=‘A‘)  忽略大小写
- ret = models.Person.objects.filter(name__startswith=‘A‘)  以什么开头
- ret = models.Person.objects.filter(name__istartswith=‘A‘) 忽略大小写
- ret = models.Person.objects.filter(name__endswith=‘A‘)
- ret = models.Person.objects.filter(name__iendswith=‘A‘) 

#### 11.9.3 外键操作(查询)

##### 11.9.3.0正向查询和反向查询

基于对象的查询(查菊花怪大战桃花侠)

正向查询:

book_obj = models.Book.objects.get(title=‘菊花怪大战桃花侠‘)   #查询书籍

反向查询

pub_obj = models.Publisher.objects.get(pk=1)

ret = pub_obj.book_set.all()  类名小写+_set  没有指定related_name  

ret = pub_obj.books.all()      指定related_name=‘books‘

基于字段的查询

ret = models.Book.objects.filter(title=‘菊花怪大战桃花侠‘)

查南海出版社的书

ret = models.Book.objects.filter(pub__name = ‘南海出版社‘)

查询初版桃花怪大战菊花侠的出版社

ret = models.Publisher.objects.filter(books__title=‘菊花怪大战桃花侠‘)  #指定了related_name="books"

ret = models.Publisher.objects.filter(book__title=‘菊花怪大战桃花侠‘)    #没有related_name   用类名的小写

##### 11.9.3.1多对多的操作:

方法一:

book_obj = models.Book.objects.filter(title="桃花侠大战菊花怪").first()

不指定related_name

print(book_obj.author_set)   -----> 关系管理对象

print(book_obj.author_set.all())

指定related_name = ‘authors‘

print(book_obj.authors)   -----> 关系管理对象

print(book_obj.authors.all())

方法二:

不指定related_name

ret = models.Book.objects.filter(anthor__name=‘liujia‘)

指定related_name = ‘authors‘

ret  = models.Book.objects.filter(anthors__name=‘liujia‘)

指定related_query_name = ‘xxx‘

ret = models.Book.objects.filter(xxx__name=‘liujia‘)

关系管理对象的方法:

ret = models.Author.objects.get(pk=1)

- ret.book.all() 所关联的所有的对象
- ret.book.set([id,id]或者[对象,对象])  设置多对多的关系
  - ret.book.set(4,5)
  - ret.book.set(*models.Book.objects.filter(pk__in=[1,2,3]))
- ret.book.add([id,id]或者[对象,对象])    添加多对多的关系
  - ret.book.add(4,5)
  - ret.book.add(*models.Book.objects.filter(pk__in=[4,5]))
- ret.book.remove([id,id]或者[对象,对象])   删除所有的多对多关系
  - ret.book.remove(4,5)
  - ret.book.remove(*models.Book.objects.filter(pk__in=[4,5]))
- ret.book.clear()   删除所有的多对多关系
- obj = ret.book.create(title=‘我是达奚栓‘,pub_id= 1)

##### 11.9.3.2 聚合和分组   F和Q

聚合和分组

```python
from app01 import models
from django.db.models import Max,Min,Avg,Sum,Count

ret = models.Book.objects.filter(pk__gt=3).aggregate(Max(‘price‘),avg=Avg(‘price‘))
print(ret)

#分组  统计每一本书的作者个数
ret = models.Book.objects.annotate(count=Count(‘author‘))  #annotate 注释的意思

#统计出每个出版社的最片之一的书的价格
#方式一
ret = models.Publisher.objects.annotate(Min(‘book__price‘)).values()
#方式二
ret = models.Book.objects.values(‘pub_id‘).annotate(min=Min(‘price‘))
```

F和Q

```python
from django.db.models import F

#比较两个字段的值
ret = models.Book.objects.filter(sale_gt=F(‘kucun‘))

#只更新sale字段
models.Book.objects.all().update(sale=100)

#取某个字段的值进行操作
models.Book.objects.all().update(sale=F(‘sale‘)*2+10)
```

```python
from django.db.models import Q
#注释:|或  &与   ~非

ret = models.Book.objects.filter(Q(Q(pk__gt=3)|Q(pk__lt=2))&Q(price__gt=80))

```

事务

```python
from django.db import transaction

try:
    with transaction.atomic():
        #进行一系列的ORM操作

        models.Publisher.objects.create(name = ‘ssss‘)

except Exception as e :
    print(e)
```

### 

原文地址:https://www.cnblogs.com/doraemon548542/p/11638550.html

时间: 2024-07-30 11:33:35

doraemon的python ORM必会操作(国庆大更新)的相关文章

doraemon的python cookie和session(国庆大更新)

### 11.10 cookie和session #### 11.10.1 cookie 定义:保存在浏览器本地上的一组组键值对 为什么有cookie? - http协议是无状态的,每次http请求都是对立的,相互之间没有关联,yongcoolie保存状态 特点: 1. 由服务器让浏览器进行设置的 2. 浏览器保存在浏览器本地 3. 下次访问的时候自动携带 4. 应用场景:登录.保存浏览器习惯.简单的投票 django中操作cookie 设置: ```python ret = redirect(

doraemon的python django的中间件(国庆大更新)

### 11.13 中间件 中间件的定义: 中间件是处理django的请求和相应的框架级别的钩子,本质上就是一个类 中间件可以定义为五个方法: - process_request(self,request) - process_view(self, request, view_func, view_args, view_kwargs) - process_template_response(self,request,response) - process_exception(self, requ

doraemon的python form组件(国庆大更新)

### 11.12 form组件 form组件的功能: 1. 生产input标签 2. 对提交的数据进行校验 3. 提供错误提示 定义form组件 ```python from django import forms class RegForm(forms.Form): username = forms.CharField() pwd = forms.CharField() ``` 使用的流程 视图 ```python form_obj = RegForm() form_obj = RegFor

doraemon的python csrf校验(国庆大更新)

### 11.11 csrf装饰器 ```python from django.views.decorators.csrf import csrf_exempt,csrf_protect,ensure_csrf_cookie csrf_exempt #某个视图不需要进行csrf校验 csrf_protect #某个视图需要进行csrf校验 ensure_csrf_cookie #确保生成csrf的cookie ``` csrf功能: 1.csrf中间件中执行process_request: ?

doraemon的python django框架的路由详解(国庆大更新)

### 11.8 路由 #### 11.8.1 urlconf ```python from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^admin/',admin.site.urls), #这里用到了正则 url(r'^home',views.home,{},name='home'), ] ``` #### 11.8.2 分组和命名分组 url上捕获的都是字符串 分组 ```python

ORM表相关操作

一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> values(*field): 返回

Python ORM 实现及python在linux下连接oracle

ORM “Object Relational Mapping”,即对象-关系映射,就是把关系数据库的一行映射为一个对象,也就是一个类对应一个表,这样,写代码更简单,不用直接操作SQL语句. orm模块:orm.py #!/usr/bin/env python # -*- coding: utf-8 -*- ' Simple ORM using metaclass ' __author__ = 'Michael Liao' class Field(object): def __init__(sel

17-2 orm单表操作和多表操作

参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1 1. 查询 2 1. 查所有 3 models.Publisher.objects.all() 4 2. 查某个具体的记录 5 models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错 6 2. 删除一条记录 7 models.Publisher.objects.get(id=1).delete() 8 3.

Django和SQLAlchemy,哪个Python ORM更好?

ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项目中的用途: 对象(Object):这部分表示哪个对象或者在哪种编程语言下使用这个框架,例如Python. 关系(Relational):这部分表示你正在使用的RDBMS数据库(关系数据库管理器系统).有许多流行的关系数据库,你可能使用以下这些:MSSQL.MySQL.Oracle.PostgreS