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>
View Code

 

三.配置其他数据库

  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() 
View Code

  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
model.py

   注: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)
model.py

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= 自定义 第三张表,可以添加其他字段
model.py
    # 多对多创建数据
    # 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()
F与Q
# 获取个数
        #
        # 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)

进阶操作
补充__,orderby ,groupby

 

    

posted @ 2017-06-17 08:56  1916  阅读(493)  评论(0)    收藏  举报