Django中model层详解
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ from django.db import models class UserType(models.Model):
nid = models.AutoField(primary_key=True) # 自增 主键
caption = models.CharField(max_length=16) class UserInfo(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField(max_length=32)
pwd = models.CharField(max_length=32)
user_type = models.ForeignKey("UserType")
# UserType也可以不加引号,加了引号之后,UserInfo表可以放在UserType的上面 # 单表基本操作 # 增
# 第一种方法:
models.UserInfo.objects.create(username='aaron',
email='aaron@163.com',
pwd='123',
)
# 第二种方法: user_dict = {
'username':'aaron',
'email':'aaron@qq.com',
'pwd':123,
'user_type':UserType.objects.get(nid=1), #nid为1的数据类型对象
} user_dict = {
'username':'aaron',
'email':'aaron@qq.com',
'pwd':123,
'user_type_id':1
} models.UserInfo.objects.create(**user_dict)
# 增加一条数据,可以接受字典类型数据 **kwargs obj = models.UserType(caption='超级管理员')
obj.save() # 查 models.UserInfo.objects.get(id=1) # 获取单条数据,不存在则报错
models.UserInfo.objects.all() # 获取全部数据
models.UserInfo.objects.filter(username='aaron') # 获取指定条件的数据
# 删
models.UserInfo.objects.filter(username='aaron').delete() # 删除指定条件的数据 # 改
models.UserInfo.objects.filter(username='aaron').update(pwd='456')
# 将指定条件的数据更新,均支持 **kwargs
obj = models.UserInfo.objects.get(id=1)
obj.pwd = '123'
obj.save() models.UserInfo.objects.filter(id__gt=1).count() # 获取个数
models.UserInfo.objects.filter(id__gt=1) # 获取id大于1的值
models.UserInfo.objects.filter(id__gte=1) # 获取id大于等于1的值
models.UserInfo.objects.filter(id__lt=10) # 获取id小于10的值
models.UserInfo.objects.filter(id__lte=10) # 获取id小于10的值
models.UserInfo.objects.filter(id__lt=10, id__gt=1)
# 获取id大于1 且 小于10的值,逗号默认取并集
models.UserInfo.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.UserInfo.objects.exclude(id__in=[11, 22, 33]) # not in models.UserInfo.objects.filter(username__contains="ron")
# 相当于百分号
models.UserInfo.objects.filter(username__icontains="ron") # icontains大小写不敏感
models.UserInfo.objects.exclude(username__icontains="ron")
models.UserInfo.objects.filter(id__range=[1, 2]) # 范围bettwen and
models.UserInfo.objects.filter(id__gt=1).order_by('id') # asc
models.UserInfo.objects.filter(id__gt=1).order_by('-id') # desc # groupby
models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
# 这里的values和annotate组合一起,意思是以ID进行分组,计算每组的个数
# group_by id
# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" # offset
models.UserInfo.objects.all()[2:3] # 连表操作
class UserProfile(models.Model):
user_info = models.OneToOneField('UserInfo')
username = models.CharField(max_length=64)
password = models.CharField(max_length=64) def __unicode__(self):
return self.username class UserInfo(models.Model):
user_type_choice = (
(0, u'普通用户'),
(1, u'高级用户'),
)
user_type = models.IntegerField(choices=user_type_choice)
name = models.CharField(max_length=32)
email = models.CharField(max_length=32)
address = models.CharField(max_length=128) def __str__(self):
return self.name class UserGroup(models.Model): caption = models.CharField(max_length=64) user_info = models.ManyToManyField('UserInfo') def __str__(self):
return self.caption class Host(models.Model):
hostname = models.CharField(max_length=64)
ip = models.GenericIPAddressField()
user_group = models.ForeignKey('UserGroup') def __str__(self):
return self.hostname user_info_obj = models.UserInfo.objects.filter(id=1).first()
# 筛选出userinfo ID为1的数据(对象)
print user_info_obj.user_type
# 拿到id为1这行数据的对象的用户类型
print user_info_obj.get_user_type_display()
print user_info_obj.userprofile.password
# print user_info_obj.userprofile_set.password???
# 拿到id为1这行数据的对象的密码,这个密码信息存放在userprofile表, user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
# 筛选出userinfo ID为1的数据(对象)并且取email, userprofile__username这两列
print user_info_obj.keys()
print user_info_obj.values()
<QuerySet [{'pwd': '123', 'username': 'alex'},
{'pwd': '123', 'username': 'erice'}]> # 小总结:
# 1、搜索条件使用 __ 连接
# 2、获取值时使用 . 连接 # 多对多操作
user_info_obj = models.UserInfo.objects.get(name=u'aaron')
# 拿到UserInfo表name列为aaron的那一行数据(对象)
user_info_objs = models.UserInfo.objects.all()
# 拿到UserInfo表的所有数据(对象)
group_obj = models.UserGroup.objects.get(caption='CEO')
# 拿到UserGroup表caption列为CEO的那一行数据(对象)
group_objs = models.UserGroup.objects.all()
# 拿到UserGroup表的所有数据(对象) # 添加数据
group_obj.user_info.add(user_info_obj)
# 正向
# 把UserInfo表name列为aaron的那一行数据(对象)添加到ceo这个用户组
# group_obj.user_info表示CEO这个组的用户信息(也就是这个组有什么用户),应该是一个对象集合
group_obj.user_info.add(*user_info_objs) # 删除数据
group_obj.user_info.remove(user_info_obj)
group_obj.user_info.remove(*user_info_objs) # 添加数据
user_info_obj.usergroup_set.add(group_obj)
# 反向
# UserInfo表name列为aaron的那一行数据(对象)所在的用户组信息(就是有哪些组),再添加CEO组
user_info_obj.usergroup_set.add(*group_objs) # 删除数据
user_info_obj.usergroup_set.remove(group_obj)
user_info_obj.usergroup_set.remove(*group_objs) # 获取数据
print group_obj.user_info.all()
print group_obj.user_info.all().filter(id=1) # 获取数据
print user_info_obj.usergroup_set.all()
print user_info_obj.usergroup_set.all().filter(caption='CEO')
print user_info_obj.usergroup_set.all().filter(caption='DBA') # 注意问题:
# 1.单表操作,跨表操作
# 2.跨表操作肯定涉及到一对一(其实是外键+unique),一对多,多对多
# 3.跨表操作:
# 正向,反向,看外键在哪,
# 正向:group_obj.user_info.all()
# 获取值:
# 搜索(fileter,value):
# 反向:user_info_obj.usergroup_set.all()
# # 唯一组合索引与 普通组合索引
class Meta:
unique_together =[
("username","email"),
]
# class Meta:
# index_together =[
# ("username","email"),
# ] # 创建多对多有两种方式
# 第一种:
class HostToGroup(models.Model):
hgid =models.AutoField(primary_key=True)
hid = models.ForeignKey('Host')
gid = models.ForeignKey("Group") class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=17) class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) # 第二种:
class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=17) # h2g = models.ManyToManyField('Group')
# group_set 反向查的对象 class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) h2g = models.ManyToManyField('Host')
# h2g = models.ManyToManyField('Host',through="HostToGroup") # 增:插入数据
models.HostToGroup.objects.create(hid=1,gid=1)
models.HostToGroup.objects.create(hid=1,gid=2)
models.HostToGroup.objects.create(hid=1,gid=3) # 正向:
obj = models.Group.objects.get(gid=1)
obj.h2g.add(*models.Host.objects.all())
# 把所有的主机都添加到i d为1的组 h2 = models.Host.objects.get(hid=2)
h1 = models.Host.objects.get(hid=1)
q = models.Host.objects.filter(hid__gt=3)
obj.h2g.add(*q) # 将一台机器,分给多个组
h = models.Host.objects.get(hid=1) # id为1的机器
obj = models.Group.objects.get(gid=1) # id为1的组
obj.h2g.add(h) #组id为1的组添加主机id为1的机器
obj = models.Group.objects.get(gid=2)
obj.h2g.add(h) #组id为2的组添加主机id为1的机器 # 反向:
h = models.Host.objects.get(hid=1)
h.group_set.add(*models.Group.objects.filter(gid__gt = 2))
# 主机id为1的主机所对应的组,如果原先的组有了就不添加,没有就继续添加 h.group_set.add(1)
h.group_set.add(models.Group.objects.get(gid=1))
h.group_set.add(*[1,2,3])
h.group_set.add(*models.Group.objects.filter(gid__gt=1)) # 正向,反向,增删改查,filter,values,一对多,多对多 # 正向:
# 增删改:
# obj = models.Group.objects.get(gid=1)
# obj.h2g.add(*models.Host.objects.all())
#
# 查:
# print group_obj.user_info.all()
# print group_obj.user_info.all().filter(id=1)
#
# 反向:
# 增删改:
# h = models.Host.objects.get(hid=1)
# h.group_set.add(*models.Group.objects.filter(gid__gt = 2))
#
# 查:
# 有filter,values:
# models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
# print user_info_obj.usergroup_set.all().filter(caption='CEO')
# models.UserType.objects.all().values('caption','userinfo')
# models.UserType.objects.all().values('caption','userinfo__user')
#
# 无filter,values:
# print user_info_obj.usergroup_set.all()
Django中model层详解的更多相关文章
- django中request对象详解(转载)
django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将 HttpRequest对象 作为第一个参数传入该函数. ...
- django中models field详解
本文参考自:django官方文档models/field 在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field o ...
- python 中model.py详解
model详解 Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 创建表 基本结构 from django.db import models # Creat ...
- django中的模型详解-1
在说明django模型之前,首先来说明一下django的生命周期,也就是一个请求到达django是如何处理的.[暂时不包含中间件] 浏览器的请求---->到达django中的urls中找到对应的 ...
- Django中的Ajax详解
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当 ...
- django中的filter详解
filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...
- django中的auth详解
Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等 ...
- Django模型model Field详解:
类型说明 AutoField一个自动增加的整数类型字段.通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True),这是一个 ...
- Django model 字段详解
字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...
随机推荐
- Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?
如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...
- DbProviderFactory
背景 在此之前,我一直以为调用哪个数据库就要用它专门的链接,除非是odbc方式.后来用了java,想.net怎么没有通用的链接呢,尤其是oracle,还要装他的客户端,如此不方便竟然能流行起来.后来知 ...
- vue el-tree:默认展开第几级节点
需求描述: Tree 树形结构,默认展开第二级菜单. 查 element 文档: 解决方法: 设置 :default-expanded-keys 的值为 idArr 数组, <el-tree ...
- centOS docker运行Asp.net Core程序
[root@localhost chenhua]# docker run -it --rm -p : --name aspnetcore_sample microsoft/dotnet-samples ...
- [加密算法]为什么说RSA难以被破解
RSA算法运用了数学“两个大的质数相乘,难以在短时间内将其因式分解”的这么一套看似简单事实上真的是很困难的一个数学难题...... 以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我 ...
- Navicat系列产品激活教程
准备 本教程可破解12.x版本,如果教程失效请联系我 # 19.1.11 破解暂时失效,请勿更新 (如已更新请卸载重新安装老版本,数据不会丢失 http://download.navicat.com/ ...
- Python-面向对象(组合、封装与多态)
一.组合 什么是组合? 就是一个类的属性 的类型 是另一个自定义类的 类型,也可以说是某一个对象拥有一个属性,该属性的值是另一个类的对象. 通过为某一个对象添加属性(这里的属性是另一个类的对象)的方式 ...
- Java_oracle超出打开游标的最大数的原因和解决方案
第一步:核查Oracle数据库 的游标的最大数 处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded) ORA-01000_maximum_o ...
- gnuradio 创建cos_source
C++教程 ys_linux@computer:~$ gr_modtool nm kcd Creating out-of-tree module in ./gr-kcd... Done. Use 'g ...
- FromData获取表单数据
一般想要不刷新页面提交数据时,可以使用ajax提交.如果数据量不大可以自己写json数据用ajax提交到后台服务,但是数据量多且需要动态添加数据时,自己写json格式数据就有点麻烦了,这时候就需要Fo ...