django(简单的配置使用,其他数据库的使用,数据库连表操作)
一.MVC 与 MTV
MVC: models(处理数据) views(模板) controllers(处理业务)
MTV: models(处理数据) templates(模板) views(处理业务)
二. django的简单使用
pip install django
1.创建django程序
a.命令创建
django-admin startproject mysite (创建工程)
cd mysite (进入工程)
python manage.py startapp app01 (创建app)
python manage.py startapp app02 (创建app)
b.pycharm
创建django程序
终端 python manage.py startapp app01 (windows)
2.django执行流程
在urls 里面配置
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/', views.home), ]
在app01 里面 添加 home函数
from django.shortcuts import HttpResponse # Create your views here. def home(request): return HttpResponse('OK')
运行django程序
终端执行 E:\django_demo>python3 manage.py runserver 127.0.0.1:8000
3.django 依赖数据库
可以在setting里面配置数据库
生成配置文件: python3 manage.py makemigrations
根据配置文件生成数据库相关的表:python3 manage.py migrate
4.admin 后台管理
创建超级用户: python3 manage.py createsuperuser
5.路由系统
静态路由与动态路由
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/', views.home), # 静态路由 url(r'^news/(?P<n1>\d+)/(?P<n2>\d+)', views.news), # 动态路由 ]
def home(request): return HttpResponse('OK') def news(request,n1,n2): ret = n1 + n2 return HttpResponse(ret)
二级路由
a.在工程里面的urls配置:
from django.conf.urls import url,include #导入include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/', views.home), #静态路由 url(r'^news/(?P<n1>\d+)/(?P<n2>\d+)', views.news),# 动态路由 url(r'^app02/', include('app02.urls')), # 二级路由 ]
b.在app02 里面新建 urls 并配置
from django.conf.urls import url from django.contrib import admin from app02 import views urlpatterns = [ url(r'^news/(?P<n1>\d+)/(?P<n2>\d+)', views.news), ]
c.在app02 里面的views 里面 创建 news 函数
def news(request,n1,n2): return HttpResponse(n1+n2)
d. 访问
http://127.0.0.1:8000/app02/news/1/2
6.创建表
a.在model 中创建表对应的类 (app02中的model)
class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) age = models.IntegerField()
b.修改工程的配置文件(setting):添加app02
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app02', ]
c.终端运行 python3 manage.py makemigrations
python3 manage.py migrate
新增static目录
STATICFILES_DIRS = (
(os.path.join(BASE_DIR,'static')),
)
7.操作表
views.py
def db_handle(request): #新增数据 # user_dict = {'username':"aaa",'password':'aaa','age':18} # models.UserInfo.objects.create(**user_dict) # models.UserInfo.objects.create(username='bbb',password='bbb',age=10) #删除数据 # models.UserInfo.objects.filter(age=10).delete() #改数据 # models.UserInfo.objects.filter(age=18).update(age=20) #查数据 userlist = models.UserInfo.objects.all() # models.UserInfo.objects.filter(username='aaa') # models.UserInfo.objects.filter(username='aaa').first() return render(request,'h1.html',{'li':userlist})
h1.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1"> <thead> <tr> <td>用户名</td> <td>密码</td> <td>年龄</td> </tr> </thead> <tbody> {% for item in li %} <tr> <td>{{ item.username }}</td> <td>{{ item.password }}</td> <td>{{ item.age}}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
三.配置其他数据库
1.配置mysql数据库 (名称要大写)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dbfour', 'HOST':'', 'PORT':'', 'USER':'root', 'PASSWORD':'root', } }
注:python3 要导入pymysql
# 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 # 如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()
2.在model中创建表对应的类
from django.db import models # Create your models here. class Publisher(models.Model): name=models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=30) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=30) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField()
3.生成镜像,生成表 (终端运行)
E:\django_demo>python3 manage.py makemigrations
E:\django_demo>python3 manage.py migrate
4.创建超级用户:
E:\django_demo>python3 manage.py createsuperuser
5.利用超级用户登录后台
6.在admin里面注册表对应的类
from django.contrib import admin from app01 import models # Register your models here. admin.site.register(models.Author) admin.site.register(models.Book) admin.site.register(models.Publisher)
7.修改admin 中显示的表名,和每一条数据的别名
from django.db import models # Create your models here. class Publisher(models.Model): name=models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=30) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: # 表名 verbose_name = '出版社' verbose_name_plural='出版社' def __str__(self): return self.name class Author(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Meta: verbose_name = '作者' verbose_name_plural='作者' def __str__(self): return self.first_name class Book(models.Model): title = models.CharField(max_length=30) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() class Meta: verbose_name = '书名' verbose_name_plural='书名' def __str__(self): return self.title
注:python2 中用__unicode__ python3 中使用__str__
8.一对多,连表查询,正向查找,反向查找
class UserInfo(models.Model): username = models.CharField(max_length=30) utype = models.ForeignKey('usertype') class UserType(models.Model): caption = models.CharField(max_length=10)
def handledb(request):
#添加数据第一种方式
# models.UserType.objects.create(caption='普通用户')
# models.UserType.objects.create(caption='超级用户')
#添加数据第二种方式 字段名_外键ID
# userinfo_obj = models.UserInfo(username='abc',utype_id= 1)
# userinfo_obj.save()
#一对多查找出的外键是对象
# ret = models.UserInfo.objects.filter(id=1).first()
# print(ret.id,ret.username,ret.utype) # 1 abc UserType object
#连表查询 innerjoin
# ret = models.UserInfo.objects.all().values('username','utype__caption')
# print(ret)
#正向查找
# ret = models.UserInfo.objects.filter(utype__caption='普通用户').values('id','username','utype__caption')
# print(ret)
#反向查找 查找出的是 userinfo 对象
# obj = models.UserType.objects.get(id=1)
# ret = obj.userinfo_set.all()
# print(ret)
# 左外连接 left join 查找出的连接对象
# ret = models.UserType.objects.all().values('id','caption','userinfo__username')
# print(ret,ret.query)
return HttpResponse('ok')
9.多对多,正向添加,反向添加数据
class Host(models.Model): hid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=30) ip = models.CharField(max_length=30) class Group(models.Model): gid = models.AutoField(primary_key=True) groupname = models.CharField(max_length=30) h2g = models.ManyToManyField('Host') # through= 自定义 第三张表,可以添加其他字段
# 多对多创建数据 # models.Host.objects.create(hostname='主机1', ip='192.168.1.1') # models.Host.objects.create(hostname='主机2', ip='192.168.1.2') # models.Host.objects.create(hostname='主机3', ip='192.168.1.3') # models.Host.objects.create(hostname='主机4', ip='192.168.1.4') # models.Host.objects.create(hostname='主机5', ip='192.168.1.5') # models.Group.objects.create(groupname='市场部') # models.Group.objects.create(groupname='研发部') # models.Group.objects.create(groupname='财务部') # models.Group.objects.create(groupname='运营部') #对第三张表添加数据 正向添加 group_obj = models.Group.objects.get(gid=1) group_obj.h2g.add(*models.Host.objects.filter(hid__gt=3)) #对第三张表添加数据 反向添加 host_obj = models.Host.objects.get(hid=1) host_obj.group_set.add(*models.Group.objects.filter(gid__gt=2))
#补充 也可以直接根据ID进行添加
group_obj = models.Group.objects.get(gid=1)
group_obj.h2g.add(1)
host_obj = models.Host.objects.get(hid=1)
host_obj.group_set.add(*[2,3])
# add 增加,remove 删除,del (删除关系表,和原表),set( 删除+添加)
class HostToGrop(models.Model): hgid = models.AutoField(primary_key=True) hostid = models.ForeignKey('Host') groupid = models.ForeignKey('Group') state = models.CharField(max_length=10) class Meta: # index_together =('hostid','groupid') unique_together = [ ('hostid','groupid'), ] class Host(models.Model): hid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=30) ip = models.CharField(max_length=30) class Group(models.Model): gid = models.AutoField(primary_key=True) groupname = models.CharField(max_length=30) h2g = models.ManyToManyField('Host',through='HostToGrop') # through= 自定义 第三张表,可以添加其他字段
#自定义第三张表 models.HostToGrop.objects.create(hostid_id=1,groupid_id=1,state ='aaa') # 类中字段名hostid ,数据库中 hostid_id, 外键的原因 # 不能使用add ,set 函数 添加数据
# extra # # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None) # Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) # Entry.objects.extra(where=['headline=%s'], params=['Lennon']) # Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) # Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) # F # # from django.db.models import F # models.Tb1.objects.update(num=F('num')+1) # Q # # 方式一: # Q(nid__gt=10) # Q(nid=8) | Q(nid__gt=10) # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') # 方式二: # con = Q() # q1 = Q() # q1.connector = 'OR' # q1.children.append(('id', 1)) # q1.children.append(('id', 10)) # q1.children.append(('id', 9)) # q2 = Q() # q2.connector = 'OR' # q2.children.append(('c1', 1)) # q2.children.append(('c1', 10)) # q2.children.append(('c1', 9)) # con.add(q1, 'AND') # con.add(q2, 'AND') # # models.Tb1.objects.filter(con) # 执行原生SQL # # from django.db import connection, connections # cursor = connection.cursor() # cursor = connections['default'].cursor() # cursor.execute("""SELECT * from auth_user where id = %s""", [1]) # row = cursor.fetchone()
# 获取个数 # # models.Tb1.objects.filter(name='seven').count() # 大于,小于 # # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # isnull # Entry.objects.filter(pub_date__isnull=True) # contains # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and # 其他类似 # # startswith,istartswith, endswith, iendswith, # order by # # models.Tb1.objects.filter(name='seven').order_by('id') # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc # group by # # from django.db.models import Count, Min, Max, Sum # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" # limit 、offset # # models.Tb1.objects.all()[10:20] # regex正则匹配,iregex 不区分大小写 # # Entry.objects.get(title__regex=r'^(An?|The) +') # Entry.objects.get(title__iregex=r'^(an?|the) +') # date # # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1)) # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1)) # year # # Entry.objects.filter(pub_date__year=2005) # Entry.objects.filter(pub_date__year__gte=2005) # month # # Entry.objects.filter(pub_date__month=12) # Entry.objects.filter(pub_date__month__gte=6) # day # # Entry.objects.filter(pub_date__day=3) # Entry.objects.filter(pub_date__day__gte=3) # week_day # # Entry.objects.filter(pub_date__week_day=2) # Entry.objects.filter(pub_date__week_day__gte=2) # hour # # Event.objects.filter(timestamp__hour=23) # Event.objects.filter(time__hour=5) # Event.objects.filter(timestamp__hour__gte=12) # minute # # Event.objects.filter(timestamp__minute=29) # Event.objects.filter(time__minute=46) # Event.objects.filter(timestamp__minute__gte=29) # second # # Event.objects.filter(timestamp__second=31) # Event.objects.filter(time__second=2) # Event.objects.filter(timestamp__second__gte=31) 进阶操作

浙公网安备 33010602011771号