Django通过建立models的方式来进行数据库查询及管理. Django APP目录中的models.py文件用于保存数据模型, 其中的每一个class都可以对应于数据库中的一个table, 而查询的接口也非常简便高效.
首先, 数据库的配置仍然是在settings.py中实现的, 可以参考之前的文章 http://blog.youkuaiyun.com/icetime17/article/details/42506779. 配置如下
# Database的设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydb1',
'USER': 'mydb1',
'PASSWORD': '123456',
'HOST': '192.168.5.126',
'PORT': 3306,
'OPTIONS': {
'charset': 'utf8',
'use_unicode': True,
},
},
}
接下来, 我们先看一下, 如何使用python的MySQLdb类库来查询该数据库.
import MySQLdb
db = MySQLdb.connect(host='192.168.5.126', db='mydb1', user='mydb1', passwd='123456')
cursor = db.cursor()
query = 'select * from result_result'
cursor.execute(query)
# 获取查询数据
data = cursor.fetchall()
print data[0]
names = [row[0] for row in data]
db.close()
至于MySQLdb的详细API, 大家可以去查询其官网, 这里就不赘述了.
那么, 重头戏来了, 我们先抛开MySQLdb不用, 来看看Django自带的数据模型.
1, 建立数据模型
一个初步的models.py文件如下:
from django.db import models
# Create your models here.
class Result(models.Model):
#每一条对应数据库一个table中的一列
name = models.CharField(max_length=20)
addr = models.CharField(max_length=100)
time = models.DateTimeField()
content = models.CharField(max_length=10000)
tid = models.IntegerField(default=0)
status = models.IntegerField(default=0)
website = models.URLField()
# 添加模型的字符串表现.
def __str__(self):
return '%s %s' % (self.name, self.address)
# Meta是内部类, 存放用于描述该模型的元数据.
class Meta:
# 如果没有提供order_by, 就缺省按照name排序.
ordering = ['name']
在models.py文件中, 每一个类都是django.db.models.Model的子类, 对应于数据库中一个table, 而该类Result中的每一个属性都对应于table中的每一列记录.
然后执行python manage.py sqlall result 就会创建或查看该Django APP result下的所有table. 如果是新创建table的话, 就会给出SQL语句的建表提示.
(django只会创建新的table, 而不会去修改已存在的table.)
没有错误的话, 就说明该模型是可用的. 然后执行python manage.py syncdb执行这些SQL语句, 则该数据库的table已经建立完成.
2, 查询操作
Django提供的数据库查询接口非常方便, 执行python manage.py shell 进入Django shell界面:
from django.db import models
from result.models import Result
data = {
'name': 'chris',
'addr': 'address',
'time': '2015-1-3 19:30:00',
'content': '哈哈,又来了.',
'website': 'http://www.github.com/icetime17',
}
r = Result(name=data['name'], addr=data['addr'], time=data['time'], content=data['content'], website=data['website'])
r.save() # 或者使用r.save(using='result_result')来制定table名
直接new一个Result的对象, 即创建一条新的记录. 使用save()将其存入db中, 即完成了一条记录的写入.一些主要查询操作如下:
# select * from result_result;
Result.objects.all()
# 提取前100条记录
Result.objects.all()[0:100]
# where name='chris' and addr='address'
Result.objects.filter(name='chris', addr='address')
# where name like '%chris%'
Result.objects.filter(name_contains='chris')
# 获取一条记录
Result.objects.get(name='chris_unique')
# 删除一条记录
Result.objects.get(name='chris_unique').delete()
# 删除多条数据
Result.objects.filter(name='chris').delete()
# order by name
Result.objects.order_by('name')
# 逆向排序
Result.objects.filter(name='chris').order_by('-name')
# 修改addr
Result.objects.filter(name='chris').update(addr='address_updated')
# 提取数据的具体内容
r = Result.objects.get(name='chris_unique')
print r.name, r.addr
以上,只是简单地记录了一些基本的操作. 如需更为详细的内容, 请参考 http://djangobook.py3k.cn/chapter05/.
3, 序列化 ModelSerializer
Django的REST framework框架提供了对Django 数据模型的序列化封装操作. 序列化其实类似于 将针对Resut对象的取值操作 全部封装起来.
首先, 引入serializers.py文件, 通过下边代码的方式, 将Result对象的各个列与rest_framework.serializers.ModelSerializer的子类关联起来.
# serializers.py
from rest_framework import serializers
from result.models import Result
class ResultSerializer(serializers.ModelSerializer):
class Meta:
model = Result
fields = ('name', 'addr', 'time',
'content', 'tid', 'status', 'website')
这样, 对Result对象的操作就会方便一些, 方式如下:
import json
from django.http import HttpResponse
from rest_framework.renderers import JSONRenderer
from result.models import Result
from result.serializers import ResultSerializer
def queryResults(request):
if request.method == 'GET':
if request.session.has_key("userid"):
data = ResultSerializer(Result.objects.filter(
name=request.session['userid'])[0:10], many=True).data
data = JSONRenderer().render(data)
return HttpResponse(json.dumps({"status": 0, "data": data}),
content_type="application/json")
else:
return HttpResponse(json.dumps({"status": 1,
"err_msg": "can not find the user info"}),
content_type="application/json")
else:
return HttpResponse(json.dumps({"status": 1,
"err_msg": "It only support HTTP GET method."}),
content_type="application/json")
这个queryResults方法, 会接收GET请求, 根据session中userid来查询该用户的记录, 并形成json格式的数据返回.有了ResultSerializer, 且它的各个域(field)都是与Result对象的列对应起来的. 则查询Result对象的方法就可以封装如下:
data = ResultSerializer(Result.objects.filter(name=request.session['userid'])[0:10], many=True).data
生成的data实际上是查询结果的数组, 通过如下方式转换成json格式
data = JSONRenderer().render(data)
关于序列化的内容, 这里只是大概提一下, 还有更多有用的操作, 大家可以参考 http://www.django-rest-framework.org/tutorial/1-serialization/.
好了, 关于Django数据模型, 就暂时写到这里了. 欢迎一起讨论.