专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

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

发布时间:2011-06-29 18:25:14 文章来源:www.iduyao.cn 采编人员:星星草
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 = 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数据模型, 就暂时写到这里了. 欢迎一起讨论.





友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: