首页 > 代码库 > models.py---Django中的数据库模型
models.py---Django中的数据库模型
Django通过建立models的方式来进行数据库查询及管理. Django APP目录中的models.py文件用于保存数据模型, 其中的每一个class都可以对应于数据库中的一个table, 而查询的接口也非常简便高效.
首先, 数据库的配置仍然是在settings.py中实现的, 可以参考之前的文章 http://blog.csdn.net/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 = http://www.mamicode.com/cursor.fetchall()>至于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 = http://www.mamicode.com/{>直接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 = http://www.mamicode.com/ResultSerializer(Result.objects.filter(>这个queryResults方法, 会接收GET请求, 根据session中userid来查询该用户的记录, 并形成json格式的数据返回.
有了ResultSerializer, 且它的各个域(field)都是与Result对象的列对应起来的. 则查询Result对象的方法就可以封装如下:data = http://www.mamicode.com/ResultSerializer(Result.objects.filter(name=request.session[‘userid‘])[0:10], many=True).data
生成的data实际上是查询结果的数组, 通过如下方式转换成json格式
data = http://www.mamicode.com/JSONRenderer().render(data)关于序列化的内容, 这里只是大概提一下, 还有更多有用的操作, 大家可以参考 http://www.django-rest-framework.org/tutorial/1-serialization/.
好了, 关于Django数据模型, 就暂时写到这里了. 欢迎一起讨论.
models.py---Django中的数据库模型