ORM之基本操作增删改查

  在函数前,先导入要操作的数据库表模块,model

  from model所在的路径文件夹 import model

在views文件中,加的路径:

#就一个app01功能的文件,在app01的文件下,在app01的views里加
from app01 import model
#在有路由分发的项目中:AutoCMDB项目里的集成所有的功能的apps文件里找到具体的功能包。
from apps.cases import model

增操作:(create) 

def index(request):
model.UserGroup.objects.create(tilte='销售部')
#在UserGroup表中添加title值销售部 
model.UserInfo.objects.create(username='george',password='',usergroup_id=1)
   #在UserGroup表中添加username,password,age,ug_id

查操作:(all、filter)

def index(request):
  group_list = model.UserGroup.objects.all()
  #将UserGroup表的所有数据拿到,起别名group_list。
  group_list = model.UserGroup.objects.filter(id=1)
  #将UserGroup表的所有数据拿到,过滤id=1的值,并放入别名group_list中。
  group_list = model.UserGroup.objects.filter(id__gt=1)
  #将UserGroup表的所有数据拿到,过滤id大于1的值,并放入别名group_list中。
  group_list = model.UserGroup.objects.filter(id__lt=1)
  #将UserGroup表的所有数据拿到,过滤id小于1的值,并放入别名group_list中。
def index(request):
group_list = models.UserGroup.objects.all()
print(group_list) # 这个列表是一个QuerySet类型的列表,里面是一个个的对象,用for循环可以取到里面的值。
#可以循环group_list里的数据,因为拿到的是列表。
for row in group_list:
print(row.id,row.title)

删操作:(delete)

def index(request):
model.UserGroup.objects.filter(id=2).delete()
  #将UserGroup表中的id=2的那列数据删除 

改操作:(update)

def index(request):
model.UserGroup.objects.filter(id=2).update(title='技术部')
#将UserGroup表中的id=2的那列的title的值改为技术部

 其他操作:

  排序操作:.order_by( )

  view的函数:

def testtest(request):
"""
排序操作
:param request:
:return:
"""
user_list = models.UserInfo.objects.all()
user_list1 = models.UserInfo.objects.all().order_by("id") #order_by是排序,参数是字段,比如加id字段,会按正序排列,从小到大
user_list2 = models.UserInfo.objects.all().order_by("-id") #加负号会按倒序排列,从大到小
user_list3 = models.UserInfo.objects.all().order_by("-id","name") #如果id有重复的,那么就按name进行排序,也是按从小到大,如果name也叫负号,那么也是从大到小
print(user_list)
print(user_list1)
return render(request,"index.html",{"user_list":user_list,"user_list1":user_list1})

  models的类:

class UserInfo(models.Model):
name = models.CharField(max_length=255)
age = models.IntegerField()
ut = models.ForeignKey("UserType") def __str__(self):
return "%s_%s" %(self.id,self.name)

  分组操作:比如根据ut的id来进行分组,计算每组的人数。 annotate()

       但是分组是要加聚合条件的。

       from django.db.models import Count,Sun,Max,Min

  views的函数:

def testtest1(request):
"""
分组操作
:param request:
:return:
"""
from django.db.models import Count
user_list = models.UserInfo.objects.values("ut_id").annotate(xxx=Count("id")) # xxx就是个别名
#这样会把ut_id一样的分为一类
print(user_list.query) #用.query是打印查看user_list生成的SQL语句    

  生成的SQL语句:

  如果是加条件的话views函数是:

def testtest1(request):
"""
分组操作
:param request:
:return:
"""
from django.db.models import Count
user_list = models.UserInfo.objects.values("ut_id").annotate(xxx=Count("id")).filter(xxx__gt=2)
#这样依旧可以加条件,条件的参数可以写实例中的别名大于2的值,在SQL中就是having操作。
  
   print(user_list.query) #用.query是打印查看user_list生成的SQL语句
   return HTTPResponse("...") 

  加filter条件的SQL:

  filter 在前和在后是不一样的,在前的话或找不到xxx别名的参数,但他可以找到Count("id") 的id。

  filter 在前表示是where条件。filter前后都有,就先进行一次筛选出需要的数据,在进程分组,最后在进行一次筛选。

def testtest1(request):
"""
分组操作
:param request:
:return:
"""
from django.db.models import Count user_list = models.UserInfo.objects.filter(id__gt=2).values("ut_id").annotate(xxx=Count("id")).filter(xxx__gt=2)
#第一个filter先进行id大于2的筛选,然后在根据ut_id进行分组,分完组根据Count 的id 进行大于2的筛选。
print(user_list.query) #用.query是打印查看user_list生成的SQL语句

  其他操作:

    models.UserInfo.objects.filter(id__lte=1) # lte和gte 分别是小于等于和大于等于
models.UserInfo.objects.filter(id__gte=1) # lte和gte 分别是小于等于和大于等于
models.UserInfo.objects.filter(id__in=[1,2,3]) # in 就必须传一个列表, 这是条件id在1,2,3里面的
models.UserInfo.objects.filter(id__range=[1,3]) # range是一个范围
models.UserInfo.objects.filter(name__startswith="xxx")
models.UserInfo.objects.filter(name__contains="xxx") #包含xxx的数据 #exclude是排除,除它以外的。
models.UserInfo.objects.exclude(id=1) # id不等于1
1. 增
create(name='xx',age='xx'.....)
dic={name"xxx,age}
create(**dic) 2. 更新
models.xx.objects.filter(id=1).update(a=1,b=2) models.xx.objects.filter(id=1).update(**dic) 3. 查询
models.xx.objects.filter(id=1,xxx)
models.xx.objects.filter(**{'id':1,'name':'alex'}) PS: Django帮助我们数据转换 -> 字典 =》 Form组件(用户请求规则验证+数据字典)

select_related 和 prefetch_related:

        ====================================================
# q = models.UserInfo.objects.all()
# select * from userinfo
# select * from userinfo inner join usertype on ...
# for row in q:
# print(row.name,row.ut.title) # select_related: 查询主动做连表
q = models.UserInfo.objects.all().select_related('ut','gp')
# select * from userinfo
# select * from userinfo inner join usertype on ...
for row in q:
print(row.name,row.ut.title) # prefetch_related: 不做连表,做多次查询
q = models.UserInfo.objects.all().prefetch_related('ut')
# select * from userinfo;
# Django内部:ut_id = [2,4]
# select * from usertype where id in [2,4]
for row in q:
print(row.id,row.ut.title) ====================================================
class Boy(models.Model):
name = models.CharField(max_length=32) class Girl(models.Model):
nick = models.CharField(max_length=32) class Love(models.Model):
b = models.ForeignKey('Boy')
g = models.ForeignKey('Girl')

===================================================== # 1. 和george有关系的姑娘
# obj = models.Boy.objects.filter(name='george').first()
# love_list = obj.love_set.all()
# for row in love_list:
# print(row.g.nick)
#
#
# love_list = models.Love.objects.filter(b__name='george')
# for row in love_list:
# print(row.g.nick)
#
# love_list = models.Love.objects.filter(b__name='george').values('g__nick')
# for item in love_list:
# print(item['g__nick'])
#
# love_list = models.Love.objects.filter(b__name='george').select_related('g')
# for obj in love_list:
# print(obj.g.nick) 1. ManyToManyField
        可以创建一个第三张表 2. 自定义关系表 3. 杂交 class Boy(models.Model):
name = models.CharField(max_length=32)
m = models.ManyToManyField('Girl',through="Love",through_fields=('b','g',))
# 查询和清空 class Girl(models.Model):
nick = models.CharField(max_length=32)
# m = models.ManyToManyField('Boy') class Love(models.Model):
b = models.ForeignKey('Boy')
g = models.ForeignKey('Girl') class Meta:
            """
            联合唯一索引:unique_together 使b和g的相同的id组合只能出现一次
            """
unique_together = [
('b','g'),
]

  关于更多models操作,借鉴url:www.cnblogs.com/wupeiqi/articles/6216618.html

 -------------- END ------------

  

ORM之单表增删改查的更多相关文章

  1. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  2. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  3. $Django orm增删改字段、建表 ,单表增删改查,Django请求生命周期

    1 orm介绍  ORM是什么   ORM 是 python编程语言后端web框架 Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM.  一 ...

  4. Django ORM基本的单表增删改查

    创建表 步骤: 1.app下models.py里创建类(继承models.Model) from django.db import models class UserInfo(models.Model ...

  5. mysql数据库单表增删改查命令

    数据库DB-database-mysql 课程安排 第一天: 1.数据库定义以及设计 2.mysql服务端的安装 3.mysql-dos操作 库的操作 表的操作 4.mysql客户端navicate工 ...

  6. MySQL初步理解,简易单表增删改查

    什么是数据库? 存储数据的仓库,本质是一个文件系统,封装了算法和文件之前数据的存储模式 阶段1:集合 数组 变量 缺点:数据存储在内存中,不能实现数据的持久化存储 阶段2:IO流 结合文件 .txt ...

  7. Django ORM字段类型 单表增删改查 万能的双下划线

    1.ORM三种模型 模型之间的三种关系:一对一,一对多,多对多. 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性: 一 ...

  8. django(七)之数据库表的单表-增删改查QuerySet,双下划线

    https://www.cnblogs.com/haiyan123/p/7738435.html https://www.cnblogs.com/yuanchenqi/articles/6083427 ...

  9. Django ORM 实现数据的单表 增删改查

    一.配置环境 1 Django 连接数据库(MySQL) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME' ...

随机推荐

  1. bzoj 3159: 决战【LCT】

    只是想复健一下LCT没想到做了不得了的题--调了两天QAQ 题解是这么说的: 但是果然还不太理解--因为swap的前后问题调了好久,(所以一开始养成的习惯后面就不要再改啦-- 总之大概就是把对位置lc ...

  2. springboot(五) 加载配置文件优先级顺序

    github代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service ...

  3. 动态规划基础复习 By cellur925

    结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...

  4. 报错Cannot determine embedded database driver class for database type NONE解决方法

    由于我不需要数据库,启动springboot报错: Cannot determine embedded database driver class for database type NONE If ...

  5. IE6 position:fixed bug hack方式

    /* IE6浏览器的特有方法 */ /* 修正IE6振动bug */ * html,* html body{background-image:url(about:blank);background-a ...

  6. Drawable(7)让一个没有pressed状态的控件使用StateList,显示pressed图片。

    TextView没有按下状态,Button有. 如图1,内容1在一个TextView上,默认它并没有按下状态. 如何让TextView有呢. 在xml中加入属性: android:clickable= ...

  7. GOTO语句以及GOTO机制的模式实现

    goto语句提供了方法内部的任意跳转,它在特殊场景下被应用. 而假设一个对象执行一个方法后,我们期望其余任何对象都可以捕获它,然后自己执行某些操作,那么可以怎么实现呢 class 皇宫 { void ...

  8. get和post中文乱码原理相关博客

    博客一:  http://blog.csdn.net/saygoodbyetoyou/article/details/16834395 博客二: http://www.jb51.net/article ...

  9. 转 pygame学习笔记(1)——安装及矩形、圆型画图

    http://www.cnblogs.com/xiaowuyi/archive/2012/06/06/2538921.html

  10. Android学习笔记(十一) Intent

    一.Intent对象的基本概念 -Intent是Android应用程序组件之一 -Intent对象在Android系统当中表示一种意图 -Intent当中最重要的内容是action与data 二.In ...