码迷,mamicode.com
首页 > 数据库 > 详细

models.py---Django中的数据库模型

时间:2015-01-14 00:50:40      阅读:242      评论:0      收藏:0      [点我收藏+]

标签: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 = 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'],
    <span style="white-space:pre">	</span>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数据模型, 就暂时写到这里了. 欢迎一起讨论.





models.py---Django中的数据库模型

标签:django

原文地址:http://blog.csdn.net/icetime17/article/details/41709647

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!