Django Model基础操作
关于设计django model
django为我们集成了ORM对数据库进行操作,我们只需要进行定义model,django就会自动为我们创建表,以及表之间的关联关系
创建好一个django项目-首先在setting.py中配置你要使用的数据
1.再settings.py中添加你的app
#django自带的是sqlite3
#下面是自带的django 数据库设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果要想要使用mysql作为你的数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'库名称',
'USER': '用户名',
'PASSWORD': '密码',
'HOST': '主机地址',
'PORT': '端口',
}
}
django关于数据库部分:https://docs.djangoproject.com/en/1.10/ref/settings/#databases
注意
在python3.x中连接mysql
- MySqlDB (python2.x)
- pymysql (python3.x)
在settings配置目录的init.py中:
import pymysql
pymysql.install_as_MySQLdb()
1.定义表结构---创建一个类
类 --> 数据库的表
字段 --> 列
对象 --> 一行数据
from django.db import models
class UserInfo(models.Model):
#设置自增长主键-如果不设置默认django会生成id列 为主键
nid = models.AutoField(primary_key=True)
#定义为字符,最大长度为32
username = models.CharField(max_length=32)
pwd = models.CharField(max_length=64)
#定义为数字类型,
age = models.IntegerField()
常用的model中的类型
models.CharField #字符类型
models.TextField #文本框类型
models.IntegerField #整型
models.BooleanField #布尔型
models.AutoField #自动增长
models.DateTimeField #时间
models.DateField #日期
models.EmailField #邮箱
models.IPAddressField #IP地址
models.ImageField #图片
models.FileField #文件
models.FilePathField #文件路径
models.URLField #URL类型
2.当我们设计完表结构以后,根据app的models.py生成数据库表
--执行下面的命令在数据库中生成对应的表
python manage.py makemigrations
python manage.py migrate
3.数据库基本操作
当我们在view视图函数中需要处理数据的时候,
注意:model里定义的大写-在调用的时候都是小写
a. 查
models.userinfo.objects.all() #获取表中所有的数据tb(表)
models.userinfo.objects.filter(nid=1)
models.userinfo.objects.filter(nid=1).first() #如果不存在会返回None
models.userinfo.objects.values() #返回一个字典格式的
models.userinfo.objects.value_list() #返回一个列表格式
b. 增
models.userinfo.objects.create(...) #添加数据的方式一
obj = models.userinfo(...) #添加数据方式二
obj.save()
c. 删
models.userinfo.objects.all().delete() #删除所有的数据
models.userinfo.objects.filter(nid=1).delete() #删除nid=1的数据
d. 改
models.userinfo.objects.all().update(...) #更新所有的数据
models.userinfo.objects.filter(nid=1).update(...) #更新nid=1的数据
django_model高级部分
我们先做一个准备工作
# 1.创建表
#定义一个部分表
class DePart(models.Model):
title = models.CharField(max_length=16)
#用户表
class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
#用户是属于某一个部分的-是一对多的关系(一个部门对应多个用户)
dp = models.ForeignKey(to="DePart",to_field="id",null=True,on_delete=models.SET_NULL)
#用户是可以属于多个用户组-是多对多的关系(一个用户可对应多个组,一个组里也可以有多个用户) 这个manytomany 也可以放到用户组中 -自动创建表(userinfo_gp)
gp = models.ManyToManyField('group')
#用户组表
class Group(models.Model):
groupname = models.CharField(max_length=32)
我们来说一下表之间的关联关系
- 一对多关系(ForeignKey)
通过对to='表名' to_field='要关联表的字段'设置进行一对多的关系
- 多对多关系(ManyToManyField)
一种是用django自带的ManytoManyField,会自动创建一张userinfo_gp表(id,foreinkey,foreinkey)-维护对应关系
一张是自己创建一个表进行维护,好处是列的数量可以自己定义
- 一对一关系(OneToOneField)
#通过view.py文件,创建对应的数据
views:
def test(request):
models.DePart.objects.create(title='IT')
models.DePart.objects.create(title='咨询')
models.DePart.objects.create(title='公关')
models.UserInfo.objects.create(username='alex',password='123',dp_id=1)
models.UserInfo.objects.create(username='eric',password='123',dp_id=1)
下面进入我们关键的查询部分
- 外键查询---ForeignKey-----
(正向)跨表操作: 由包含ForeignKey的表查询另一张表的内容,获取外键关联表的内容
格式:
obj.表名.列名
obj.表名_列名
# 1.获取对象 跨表查询1
# 通过all获取到的是一个列表形式[obj,obj,obj]
# q=models.UserInfo.objects.all()
# for row in q:
# print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title,row.dp) # 2. 字典 跨表查询2
# 通过values获取到的是一个字典形式
# q=models.UserInfo.objects.values('username','password','dp_id','dp__title')
# for row in q:
# print(row.username,row.password,row.dp_id,row.dp.id,row.dp.title,row.dp) # 3.元组 跨表查询3
# 通过value_list获取到一个列表-元组的格式[(),(),()]
# q=models.UserInfo.objects.values_list('username','password','dp_id','dp__title')
# for row in q:
# print(row)
# print(row[0],row[3])
(反向)跨表 ,本身表内没有外键存在...但对方表中使用了该表做外键
格式
- obj.表名_set.列名
- obj.表名__列名
- obj.表名_set.all()
如果正向的表中设置了related_name=‘xxx’
obj.xxx_set.列名
#两种操作类型,userinfo_set 和 userinfo__
#1.对象
# v=models.DePart.objects.all()
# for row in v:
# print(row.id,row.title,row.userinfo_set.all())
#2.字典
# v=models.DePart.objects.values('id','title','userinfo__password','userinfo__password')
# for row in v:
# print(row)
#3.元组
# v=models.DePart.objects.values_list('id','title','userinfo__username','userinfo__password')
# for row in v:
# print(row)
2.多对多查询 ---ManyToManyField---
如果是自己创建的表,就直接对自己创建的第三张表进行操作。
通过ORM根据ManyToManyField字段生成的表进行操作
userinfo_obj=models.UserInfo.objects.filter(id=1).first() #查找用户ID为1的数据
# 1.添加数据的方式
# userinfo_obj.m.add(1) #添加用户ID为1,组ID为1 的
# userinfo_obj.m.add(2,3,4) #添加用户ID为1,组ID为2,3,4 的
# userinfo_obj.m.add(*[1,2]) # 2.删除数据的方式
# userinfo_obj.m.remove(1)
# userinfo_obj.m.remove(2,3)
# userinfo_obj.m.remove(*[1,]) # 3.清除数据
# userinfo_obj.m.clear() #清楚用户ID为1 的所有组数据 #相当于更新操作,将所有的数据清除,再添加1,2
# userinfo_obj.gp.set([1,2,])
# q=userinfo_obj.gp.all() #获取用户组的信息
# print(q) #建立在上一次查询基础上,再次做二次筛选
q = userinfo_obj.gp.filter(id__gt=1)
print(q)
return HttpResponse('123')
前端展示:
关于ManyToMany字段:
操作:
表设计
class Ip(models.Model):
'''所有IP地址'''
ip = models.GenericIPAddressField(null=True)
item = models.ForeignKey('Item')
platform = models.ForeignKey('Platform',null=False)
m_port = models.ManyToManyField('Port')
class Port(models.Model):
port = models.IntegerField()
comment = models.CharField(max_length=64,null=True,blank=True)
def __str__(self):
return str(self.port)
views:
all_ip = models.Ip.objects.all()
# for i in all_ip:
# print(i.m_port.all())
return render(request, 'ip_list.html',locals())
前端展示:
{% for ip_obj in all_ip %}
<td>{% for port in ip_obj.m_port.all %}{{ port.port }},{% endfor %}</td>
{% endfor %}
后续增加ORM操作内容
ORM 创建表
FK常用操作
class A(Model):
name = models.CharField(....) class B(Model):
name = models.Charfild(...)
fk = models.FK(A)
B表中有几列
id
name
fk_id
a.跨表操作
b_list = models.B.objects.all()
for item in b_list:
item.id
item.name
item.fk_id
item.fk
item.fk.name
item.k.id
b.跨表操作
b_list = models.B.objects.values("id","name","fk_id","fk__name")
for item in b_list:
item["id"]
item["name"]
item["fk_id"]
item["fk__name"]
c.跨表操作
b_list = models.B.objects.value_list("id","name","fk_id","fk__name")
for item in b_list:
item[0]
item[1]
item[2]
item[3]
d.跨表操作
models.B.objects.filter(fk__name="李鹏飞")
M2M 常用操作
class A(Model):
name = models.CharField(....) class B(Model):
name = models.Charfild(...)
m = models.M2M(A)
a. B表中有几列
id
namePS: 自动生成一个第三张表:m 用于间接的对第三张表进行操作
b. 在B表中插入三条数据: A表中插入2条数据
models.A.objects.create(name="张")
models.A.objects.create(name="三")
models.A.objects.create(name="丰")models.B.objects.create(name="兴普")
models.B.objects.create(name="香香")
models.B.objects.create(name="皮皮")
c. 兴普和【张,三,丰】创建关系
obj = models.B.objects.create(name="兴普")
obj.m.add(1)
obj.m.add(2)
obj.m.add(*[1,2,3])
d. 查找和兴普有关系的人?
obj = models.B.objects.create(name="兴普")
obj.m.all() [A-obj,A-obj]
Django Model基础操作的更多相关文章
- model基础操作
url.py from django.contrib import admin from django.urls import path,include from app1.views import ...
- Python学习---Django的基础操作180116
Django创建数据库操作 django流程之model实例 settigs.py:更改Django2.0.1的配置,更新为之前的路径配置 'DIRS': [os.path.join(BASE_DIR ...
- Django Model 基础数据库操作应用
https://blog.csdn.net/Mrzhangjwei/article/details/53001841 一.数据库操作1.创建model表 基本结构: from django.db im ...
- 03: Django Model数据库操作
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Django——model基础
ORM 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 创建表(建立模型) 实例:我们来假定下 ...
- Django的基础操作总结
1:准备开始 建立一个新的project: django-admin.py startproject XXXXXX(名称) 建立一个新的App:python manage.py startapp XX ...
- model基础操作(下)
3.Django多对多表结构操作 3.1 第一种: ManyToManyField 自己不创建第三张关系表,有m2m字段: 根据queryset对象增删改查(推荐) from django ...
- Python Web框架篇:Django Model基础
model是关于你的数据的单一的,确定的信息来源. 它包含您正在存储的数据的基本字段和行为.Django通过抽象化的模型层(models)为你的网络应用提供对于数据的结构化处理和操作处理,数据库相关的 ...
- Django开发基础----操作数据库
Django中对数据库的操作是由Models来完成的 Models是什么? 通常,一个Model对应数据库的一张数据表 Django中Models以类的形式出现 它包含了一些基本字段以及数据的一些行为 ...
随机推荐
- Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势
一.Redis数据类型 1.string string是Redis的最基本数据类型,一个key对应一个value,每个value最大可存储512M.string一半用来存图片或者序列化的数据. 2.h ...
- Linux下onvif客户端获取h265 IPC摄像头的RTSP地址
1. 设备搜索,去获取webserver 的地址 ,目的是在获取能力提供服务地址,demo:https://www.cnblogs.com/croxd/p/10683429.html 2. GetCa ...
- 浏览器与go语言的websocket通信
简介WebSocket是HTML5一种新的协议.顾名思义,它在服务器和浏览器之间建立了全双工通信. 需求背景区块链测试系统web前端平台需要动态接收后端发送的状态信息改变一次测试session过程的状 ...
- 大数据入门第十一天——hive详解(三)hive函数
一.hive函数 1.内置运算符与内置函数 函数分类: 查看函数信息: DESC FUNCTION concat; 常用的分析函数之rank() row_number(),参考:https://www ...
- 【转载】COM 组件设计与应用(十)——IDispatch 接口 for VC.NET
原文:http://vckbase.com/index.php/wv/1225.html 一.前言 终于写到了第十回,我也一直期盼着写这回的内容耶,为啥呢?因为自动化(automation)是非常常用 ...
- Kubernetes学习之路(十一)之Pod状态和生命周期管理
一.什么是Pod? Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP ...
- [IOI2018] werewolf 狼人 kruskal重构树,主席树
[IOI2018] werewolf 狼人 LG传送门 kruskal重构树好题. 日常安利博客文章 这题需要搞两棵重构树出来,这两棵重构树和我们平时见过的重构树有点不同(据说叫做点权重构树?),根据 ...
- 关于恶意说说自动在QQ空间转发的机制
有些很讨厌的带链接说说,只要你在手机打开它,就会自动转发,内容极其不雅 一怒之下我决定看个究竟首先,在此页开头有此关键语句: <iframe src="http://rtb.map.q ...
- EasyUI系列学习笔记(一)——注册
前面介绍过EasyUI是一个前段框架,开发之前需要导入底层包:我这里采用的是EasyUI 1.4版本~ 今天主要是搭建一个EasyUI的环境,同时做一个登陆页面... 环境搭建 导入需要的文件到项目中 ...
- 【CodeForces-1041C】Coffee Break(二分解决关于set,pair,upper_bound用法)
//题意:一个的工作时间是m分钟. // 在特定的时间和咖啡 n a1,a2....an,, ai代表的是每个咖啡要在一天中对应的时间点喝掉 // 每一次喝咖啡的时间为1分钟 // 必须在一天中的ai ...