django学习二--django+mysql+win10配置

django默认的是自带的sqlite3数据库,这里我们讲讲配置mysql数据库

1. 安装MySQLdb

不同的系统安装MySQLdb的方法不同:

  1. easy_install mysql-python (mix os)
  2. pip install mysql-python (mix os)
  3. apt-get install python-mysqldb (Linux Ubuntu)
  4. yum install MySQL-python (linux Fedora, CentOS)

本文讲讲win10配置MySQLdb:

1. 安装c驱动

这里我先装了个编译c的:Microsoft Visual C++ Compiler for Python 2.7

2.安装mysqldb

然后直接去官网上下了mysqldb:https://pypi.python.org/pypi/MySQL-python/
或者用我上传到csdn上的资源:http://download.csdn.net/detail/lxfhahaha/9918262

3.检验

安装好后,cmd下 import MySQLdb看看,ok
django学习二--django+mysql+win10配置_第1张图片

2.mysql新建数据库

我在mysql新建了一个叫example 的数据库

3. 修改配置项

打开已经创建好的django项目,修改settings.py

-在INSTALLED_APPS添加自己的工程名称。
-修改DATABASES项中配置的内容。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    '*****'
]


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '****',
        'USER':'*****',
        'PASSWORD':'******',
        'HOST':'*******',
        'PORT':'****',
    }
}

django学习二--django+mysql+win10配置_第2张图片

4. 生成model

现在我们有两种情况:

  1. 一种是数据库里已经有表了,我们把它同步到本地生成model:python manage.py inspectdb>models.py
  2. 一种是本地的model已经写好了,数据库还是空的,我们把代码同步到数据库:python manage.py syncdb

这里我讲讲新建model,新建models.py,然后新建了people类

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    birthday=models.DateField()

django学习二--django+mysql+win10配置_第3张图片
然后自动生成数据库表:

先 cd 进入 manage.py 所在的那个文件夹下,输入下面的命令

# Django 1.6.x 及以下
python manage.py syncdb

# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations --empty app名称
python manage.py makemigrations
python manage.py migrate

不清楚自己django版本的童鞋,可以用以下指定查看:
django学习二--django+mysql+win10配置_第4张图片

好了,开始同步:

python manage.py makemigrations --empty helloworld
python manage.py makemigrations
python manage.py migrate

django学习二--django+mysql+win10配置_第5张图片

ok,他生成的表是以appname_classname命名的,他还生成了一系列自带的表:
django学习二--django+mysql+win10配置_第6张图片

这是新建的类person的数据库结构(主键id是自动生成的):
django学习二--django+mysql+win10配置_第7张图片

5.使用model

好了,我们修改一下models.py

# coding=UTF-8
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    birthday=models.DateField()


    def __unicode__(self):
    # 在Python3中使用 def __str__(self):
    # 用来输出
         return 'name:'+self.name+';age:'+str(self.age)+';birthday:'+str(self.birthday)

django学习二--django+mysql+win10配置_第8张图片

打开cmd测试一下:

python manage.py shell
from helloworld.models import *
from datetime import *
p=Person(name='123',age=12,birthday=date(1997,5,12))
p.save()
list=Person.objects.all()
list[0]

django学习二--django+mysql+win10配置_第9张图片

6. model方法

新建一个对象的方法有以下几种:

 1. Person.objects.create(name=name,age=age,birthday=date(1997,5,12))
 2. p = Person(name="WZ", age=23,birthday=date(1997,5,12))
     p.save()
 3. p = Person(name="TWZ")
     p.age = 23 
     p.birthday=date(1997,5,12)
     p.save()
 4. Person.objects.get_or_create(name="WZT",age=23,birthday=date(1997,5,12))

第四种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

获取对象有以下方法:

1. Person.objects.all()

2. Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存

3. Person.objects.get(name=name)

get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter

1. Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人

2. Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件

3. Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人

4. Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写

5. Person.objects.filter(name__regex="^abc")  # 正则表达式查询

6. Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写

filter是找出满足条件的,当然也有排除符合某条件的

1. Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象

2. Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名称含有abc, 但是排除年龄是23岁的

7. 举个例子

好了,写个小demo看看

index.html


<html>
<head>
    <title>title>
    <meta charset="utf-8">
head>

<body>
<form action="/mytest/" method="post" enctype="multipart/form-data">
{% csrf_token %}   
name: <input type="text" name="name"><br>
age: <input type="text" name="age"><br>
birthday: <input type="date" name="birthday"><br>
<input type="submit" value="提交">
form>
<br>
列表:
<table>
    <tr><td>idtd><td>nametd><td>agetd><td>birthdaytd>tr>
    {% for a in list %}
     <tr>
        <td>{{a.id|safe}}td><td>{{a.name|safe}}td><td>{{a.age|safe}}td><td>{{a.birthday}}td>
     tr>
    {%endfor%}
table>
body>

html>

urls.py

from django.conf.urls import url
from django.contrib import admin
from . import view
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^mytest/',view.index)
]

view.py

from django.http import HttpResponse
from django.http import HttpResponseRedirect 
from django.shortcuts import render
from models import *
from django.views.decorators.csrf import csrf_protect

@csrf_protect
def index(request):
    if request.POST:
        p=Person(name=request.POST['name'],age=request.POST['age'],birthday=request.POST['birthday'])
        p.save()
    return getdata(request)

def getdata(request):
    list=Person.objects.all()
    print(list)
    return render(request, 'index.html',{'list':list})

models.py

# coding=UTF-8
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    birthday=models.DateField()


    def __unicode__(self):
    # 在Python3中使用 def __str__(self):
    # 用来输出
         return 'name:'+self.name+';age:'+str(self.age)+';birthday:'+str(self.birthday)

效果:
django学习二--django+mysql+win10配置_第10张图片


Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/

Fields相关官方文档:https://docs.djangoproject.com/en/dev/ref/models/fields/

你可能感兴趣的:(python)