表数据操做主要包含对数据和表的增删改查,表类型有单表,一对多类型表和多对多类型表。html
表数据 | 代指 |
---|---|
类名 | 生成数据库表名 |
类中models.字段类型 | 生成数据库字段 |
models.OneToOneField | 一对一 |
models.ForeignKey | 一对多表 |
models.ManyToManyField | 多对多表 |
OneToOneField()参数python
OneToOneField(ForeignKey) to, # 要进行关联的表名 to_field=None # 要关联的表中的字段名称 on_delete=None, # 当删除关联表中的数据时,当前表与其关联的行的行为 ###### 对于一对一 ###### # 1. 一对一其实就是 一对多 + 惟一索引 # 2.当两个类之间有继承关系时,默认会建立一个一对一字段 # 以下会在A表中额外增长一个c_ptr_id列且惟一: class C(models.Model): nid = models.AutoField(primary_key=True) part = models.CharField(max_length=12) class A(C): id = models.AutoField(primary_key=True) code = models.CharField(max_length=1)
ForeignKey()参数mysql
ForeignKey(ForeignObject) # ForeignObject(RelatedField) to, # 要进行关联的表名 to_field=None, # 要关联的表中的字段名称 on_delete=None, # 当删除关联表中的数据时,当前表与其关联的行的行为 - models.CASCADE,删除关联数据,与之关联也删除 - models.DO_NOTHING,删除关联数据,引起错误IntegrityError - models.PROTECT,删除关联数据,引起错误ProtectedError - models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段须要设置为可空) - models.SET_DEFAULT,删除关联数据,与之关联的值设置为默认值(前提FK字段须要设置默认值) - models.SET,删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) def func(): return 10 class MyModel(models.Model): user = models.ForeignKey( to="User", to_field="id" on_delete=models.SET(func),) related_name=None, # 反向操做时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all() related_query_name=None, # 反向操做时,使用的链接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名') limit_choices_to=None, # 在Admin或ModelForm中显示关联数据时,提供的条件: # 如: - limit_choices_to={'nid__gt': 5} - limit_choices_to=lambda : {'nid__gt': 5} from django.db.models import Q - limit_choices_to=Q(nid__gt=10) - limit_choices_to=Q(nid=8) | Q(nid__gt=10) - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') db_constraint=True # 是否在数据库中建立外键约束 parent_link=False # 在Admin中是否显示关联数据
ManyToManyField()参数sql
ManyToManyField(RelatedField) to, # 要进行关联的表名 related_name=None, # 反向操做时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all() related_query_name=None, # 反向操做时,使用的链接前缀,用于替换【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名') limit_choices_to=None, # 在Admin或ModelForm中显示关联数据时,提供的条件: # 如: - limit_choices_to={'nid__gt': 5} - limit_choices_to=lambda : {'nid__gt': 5} from django.db.models import Q - limit_choices_to=Q(nid__gt=10) - limit_choices_to=Q(nid=8) | Q(nid__gt=10) - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') symmetrical=None, # 仅用于多对多自关联时,symmetrical用于指定内部是否建立反向操做的字段 # 作以下操做时,不一样的symmetrical会有不一样的可选字段 models.BB.objects.filter(...) # 可选字段有:code, id, m1 class BB(models.Model): code = models.CharField(max_length=12) m1 = models.ManyToManyField('self',symmetrical=True) # 可选字段有: bb, code, id, m1 class BB(models.Model): code = models.CharField(max_length=12) m1 = models.ManyToManyField('self',symmetrical=False) through=None, # 自定义第三张表时,使用字段用于指定关系表 through_fields=None, # 自定义第三张表时,使用字段用于指定关系表中那些字段作多对多关系表 from django.db import models class Person(models.Model): name = models.CharField(max_length=50) class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField( Person, through='Membership', through_fields=('group', 'person'), ) class Membership(models.Model): group = models.ForeignKey(Group, on_delete=models.CASCADE) person = models.ForeignKey(Person, on_delete=models.CASCADE) inviter = models.ForeignKey( Person, on_delete=models.CASCADE, related_name="membership_invites", ) invite_reason = models.CharField(max_length=64) db_constraint=True, # 是否在数据库中建立外键约束 db_table=None, # 默认建立第三张表时,数据库中表的名称
类型 | 获取方式 |
---|---|
[obj,obj]对象 | .all,.filter |
[{},{}]字典 | .values |
[(),()]元组 | .vlaues_list |
多数据获取用列表形式表示,好比select标签单选获取为$().val(1),多选为$.val([1,2,3])数据库
须要获取的数据=表对象.表字段名django
如: peo_obj = models.Table.objects.last() #获取表最后一行数据的对象 peo_id = peo_obj.id #获取表数据对象中的id字段值
models.py架构
注:不设置id字段列默认自动添加app
from 应用名 import models class 类名(models.Model): id=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID') #建立主键,自增加、设置主键、无序列号设置、别名为ID 字段1=models.CharField("字段1",max_length=20) #建立字符串字段,最大长度为20,别名为【字段1】 字段2=models.IntegerField(verbose_name='字段2') #建立整型字段,别名为【字段2】
setting.py函数
INSTALLED_APPS = [应用名]
建立生成表测试
python manage.py makemigrations 应用名 python manage.py migrate
反向建立数据库表(通常用于配置链接好数据库,数据库中已经有数据,但项目中没有models表的已有环境)
python manage.py inspectdb
建立后导出并替代models.py,默认生成路径是项目根目录而不是APP根目录
python manage.py inspectdb > models.py
在views.py中添加视图函数,要提早引用视图models类
from 应用名.models import 类名 #引入视图数据库models类
方法一(实例类的对象):
def 函数名(request): model对象=类名(字段1="值1",字段2="值2") #根据字段添加值 model对象.save() #保存到数据库 return 返回值
方法二(调用create方法):
def 函数名(request): 类名.objects.create(字段1="值1",字段2="值2") #根据字段添加值,并同步到数据库 return 返回值
字典传输数据增长数据
def 函数名(request): 类名.objects.create(**kwargs) #字典形式传输和添加,字典键对应数据库字段 return 返回值
调用filter方法查找并删除
def 函数名(request): 类名.objects.filter(查找字段名="值").delete() return 返回值
方法一:(实例对象从新赋值)
def 函数名(request): model对象=类名.objects.get(查找字段名="值") #获取数据对象集合 model对象.修改字段名="值" #修改字段值 model对象.save() #保存到数据库
方法二:(调用filter方法查找并从新赋值)
def 函数名(request): models.类名[表名].objects.filter(查找字段名="值").update(要修改的字段名="修改后值") #查询指定字段所在行,给该行要修改的字段重新赋值 return 返回值
def 函数名(request): model对象集合=类名.objects.方法(条件) #查询条件是可选项,好比使用模糊查询 model对象=model对象集合[0] #查询条件对象集合特定的对象 对象对应值=model对象.字段名 #查询对象对应的值 return 返回值
方法 | 释义 |
---|---|
filter(**kwargs) | 查找内容,值能够是(字段="值")也能够泛指字典,包含了与所给筛选条件相匹配的对象 |
all() | 显示全部内容,括号内可以使用切片,如:all([:3])、all([::2])等 |
get(**kwargs) | 返回与所给筛选相匹配的结果,结果只有一个,若没有结果或超过一个抛出异常 |
values(*field) | 返回一个ValueQuerySet,一个特殊的QuerySet,运行后并非一系列model的实例化对象,而是一个可迭代的字典序列 |
values_list(*field) | 返回一个ValueQuerySet,一个特殊的QuerySet,运行后并非一系列model的实例化对象,而是一个元组序列 |
exclude(**kwargs) | 包含了与所给筛选条件不匹配的对象 |
order_by(*field) | 对查询结果排序 |
reverse() | 对查询结果反向排序 |
distinct() | 从反向结果中剔除重复记录 |
count() | 返回数据库中匹配查询(QuerySet)的对象数量 |
first() | 返回第一条记录 |
last() | 返回最后一条记录 |
exists() | 若是QuerySet包含数据,返回True,不然返回False |
函数 | 释义 |
---|---|
Avg("字段名") | 平均值 |
Sum("字段名") | 求和 |
Max("字段名") | 求最大值 |
Min("字段名") | 最小值 |
示例
from django.db.models import Avg,Sum,Max,Min models.表名.objects.all().aggregate(Sum('计算的字段'))
类名.objects.filter(查询条件)
查询条件 | 释义 |
---|---|
字段= | 等于 |
字段__exact= | 精准查询 |
字段__gt= | 大于 |
字段__gte= | 大于等于 |
字段__contains= | 模糊匹配(区分大小写) |
字段__icontains= | 模糊匹配(不区分大小写) |
字段__in= | 包含icontains |
字段__isnull= | 是否为空 |
字段__lt= | 小于 |
字段__lte= | 小于等于 |
字段__range= | 范围 |
from django.db import connection def my_custom_sql(self): with connection.cursor() as cursor: cursor.execute("执行sql语句",) #查出一条数据 row = cursor.fetchone() #查出全部数据 #row = cursor.fetchall() return row
示例所用方法较少,可根据示例环境自行测试各个方法
Mydiango APP migrations 0001_initial.py __init_.py templates __init__.py index.html admin.py apps.py models.py tests.py views.py Mydiango settings.py urls.py wsgi.py manage.py
django-admin startproject Mydjango cd Mydjango python manage.py startapp APP
INSTALLED_APPS 添加APP[之前存在的勿删]
'APP',
MYSQL配置数据库链接
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydata', 'USER': 'mydata', 'PASSWORD': 'Abc123', 'HOST': '192.168.88.80', 'POST': '3306', } }
SQLService配置数据库链接
DATABASES = { 'default': { 'NAME': 'screen', 'ENGINE': 'sql_server.pyodbc', 'HOST': '127.0.0.1', 'PORT': '1433', 'USER': 'user', 'PASSWORD': 'password', 'OPTIONS':{ 'driver':'SQL Server Native Client 10.0', } } }
TEMPLATES 添加静态文件存放目录路径[之前存在的勿删]
'DIRS': [os.path.join(BASE_DIR, 'APP/templates')],
在项目全局设置 Mydjango -> Mydjango -> __init__.py 中设置使用pymysql链接数据库
import pymysql pymysql.install_as_MySQLdb()
# coding=utf8 from django.contrib import admin from django.urls import path,re_path from APP import views urlpatterns = [ path('admin/', admin.site.urls), re_path('^$',views.Index), path('add/', views.Add_data), # url【add】添加 --- 对应 ---- 添加视图函数【Add_data】 path('delete/', views.Del_data), # url【delete】删除 --- 对应 ---- 删除视图函数【Del_data】 path('update/', views.Up_data), # url【update】更新 --- 对应 ---- 更新视图函数【Up_data】 path('select/', views.Sel_data), # url【select】查询 --- 对应 ---- 查询视图函数【Sel_data】 ]
# -*- coding:utf8 -*- from django.shortcuts import render,HttpResponse import datetime from APP.models import Animal_Table def Index(request): #网站默认首页 return render(request,"index.html",locals()) def Add_data(request): #添加数据函数 Animal_Table.objects.create(Type="森林",Name="松鼠",Li_ID=1) # 根据字段添加值,并同步到数据库 Animal_Table.objects.create(Type="森林",Name="老虎",Li_ID=1) Animal_Table.objects.create(Type="海洋",Name="鲸鱼",Li_ID=2) Animal_Table.objects.create(Type="海洋",Name="海龟",Li_ID=2) return HttpResponse("添加成功") def Del_data(request): #删除数据函数 Animal_Table.objects.filter(Name="鲸鱼").delete() # 根据字段查找,并删除对应行 return HttpResponse("删除成功") def Up_data(request): #更新数据函数 Animal_Table.objects.filter(Name="老虎").update(Type="猪圈") # 查询指定字段所在行,给该行要修改的字段重新赋值 return HttpResponse("更新成功") def Sel_data(request): #查询数据函数 Obj_Mut = Animal_Table.objects.all() # 获取对象集合 print("对象集合:",Obj_Mut) Obj_One = Obj_Mut[1] # 获取特定的对象 print("集合中的对象:",Obj_One) Obj_Pro = Obj_One.Type # 获取特定的对象字段值【类型】 print("对象对应值-类型:",Obj_Pro) Obj_Name = Obj_One.Name # 获取特定的对象字段值【名字】 print("对象对应值-姓名:",Obj_Name) sel_num = Animal_Table.objects.count() # 获取查询出来的全部数量 print("查询数量为:",sel_num) return HttpResponse(Obj_Pro,Obj_Name)
# -*- coding:utf8 -*- from django.db import models ########################################## 建立表 ######################################### class Animal_Table(models.Model): Type=models.CharField(max_length=20) #建立字符串字段,最大长度为20 Name=models.CharField(max_length=20) #建立字符串字段,最大长度为20 Li_ID=models.IntegerField() #建立整型字段 def __str__(self): #类str方法,用于调取显示字符串而不是内存地址 return self.Name
from django.apps import AppConfig class AppConfig(AppConfig): name = 'APP'
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <a href="/add/">添加数据</a> <a href="/delete/">删除数据</a> <a href="/update/">更改数据</a> <a href="/select/">查询数据</a> </div> </body> </html>
执行完成后 项目 migrations 会生成数据库变动文件,本示例生成文件为0001_initial.py
python manage.py makemigrations APP python manage.py migrate
运行服务
python manage.py runserver 8000
测试须要访问 http://127.0.0.1:8000 测试