#!/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层详解的更多相关文章

  1. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  2. django中models field详解

    本文参考自:django官方文档models/field 在model中添加字段的格式一般为:  field_name = field_type(**field_options) 一  field o ...

  3. python 中model.py详解

    model详解 Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 创建表 基本结构 from django.db import models # Creat ...

  4. django中的模型详解-1

    在说明django模型之前,首先来说明一下django的生命周期,也就是一个请求到达django是如何处理的.[暂时不包含中间件] 浏览器的请求---->到达django中的urls中找到对应的 ...

  5. Django中的Ajax详解

    AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当 ...

  6. django中的filter详解

    filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...

  7. django中的auth详解

     Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等 ...

  8. Django模型model Field详解:

    类型说明 AutoField一个自动增加的整数类型字段.通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True),这是一个 ...

  9. Django model 字段详解

    字段类型选择: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 ...

随机推荐

  1. Efuse--芯片存储

    1.Efuse是什么 Efuse类似于EEPROM,是一次性可编程存储器,在芯片出场之前会被写入信息,在一个芯片中,efuse的容量通常很小,一些芯片efuse只有128bit. 2.efuse的作用 ...

  2. Ubuntu16.04用源安装Nginx+PHP5.6+MySQL5.6

    安装Nginx 1.首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-k ...

  3. tomcat apr 部署

    背景 这还是为了高并发的事,网上说的天花乱坠的,加了apr怎么怎么好,我加了,扯淡.就是吹牛用.我还是认为,性能问题要考设计逻辑和代码解决,这些都是锦上添花的. 步骤 1 windows 部署简单,虽 ...

  4. Alpha 冲刺 (1/10)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:来自双十一的爱 团队部分 后敬甲(组长) 过去两天完成了哪些任务 文字描述 Alpha版本的任务细分安排 leangoo ...

  5. JSON.stringify与JSON.parse

      JSON.stringify(value [, replacer] [, space]) 用于将 对象 --> JSON 字符串. value:对象.数组.类 replacer: 数组时:v ...

  6. 数字证书及CA的扫盲介绍

    ★ 先说一个通俗的例子 考虑到证书体系的相关知识比较枯燥.晦涩.俺先拿一个通俗的例子来说事儿. ◇ 普通的介绍信 想必大伙儿都听说过介绍信的例子吧?假设 A 公司的张三先生要到 B 公司去拜访,但是 ...

  7. 028_shell脚本递归求值

    一. #!/bin/sh factorial() { if [ "$1" -gt "1" ]; then i=`expr $1 - 1` j=`factoria ...

  8. UniversalImageLoader(异步加载大量图片)

    UniversalImageLoader是用于加载图片的一个开源项目,UniversalImageLoader是实现异步加载大量图片的源码和例子,包括缓存.硬盘缓存.容错机制等技术.在其项目介绍中是这 ...

  9. echo和重定向

    命令: echo 作用: echo有重复的意思,会在终端中显示参数指定的文字,通常会和重定向联合使用 使用: echo 文字内容 例子: 在终端中显示hello echo hello 命令: > ...

  10. Confluence 6 外部小工具在其他应用中设置可信关系

    为了在你的 Confluence 中与其他应用建立外部小工具,我们建议你在 2 个应用之间设置 OAuth 或者信任的应用连接关系.在这个例子中,外部应用为小工具的服务器(服务器提供者)和 Confl ...