django默认的是自带的sqlite3数据库,这里我们讲讲配置mysql数据库
不同的系统安装MySQLdb的方法不同:
本文讲讲win10配置MySQLdb:
这里我先装了个编译c的:Microsoft Visual C++ Compiler for Python 2.7
然后直接去官网上下了mysqldb:https://pypi.python.org/pypi/MySQL-python/
或者用我上传到csdn上的资源:http://download.csdn.net/detail/lxfhahaha/9918262
我在mysql新建了一个叫example
的数据库
打开已经创建好的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':'****',
}
}
现在我们有两种情况:
python manage.py inspectdb>models.py
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()
先 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
好了,开始同步:
python manage.py makemigrations --empty helloworld
python manage.py makemigrations
python manage.py migrate
ok,他生成的表是以appname_classname命名的,他还生成了一系列自带的表:
这是新建的类person的数据库结构(主键id是自动生成的):
好了,我们修改一下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)
打开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]
新建一个对象的方法有以下几种:
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岁的
好了,写个小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 models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/
Fields相关官方文档:https://docs.djangoproject.com/en/dev/ref/models/fields/