Pyhton_Django学习笔记(五) 模型与MYSQL数据库使用

先上简单DEMO 使用MYSQL数据库显示数据

from django.shortcuts import render_to_response
import MySQLdb

def book_list(request):
    db 
= MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
    cursor 
= db.cursor()
    cursor.execute(
'SELECT name FROM books ORDER BY name')
    names 
= [row[0] for row in cursor.fetchall()]
    db.close()
    
return render_to_response('book_list.html', {'names': names})

 Django提供了在配置文件中 settings.py中配置数据库的支持。

例如:在settings.py中编辑:

MANAGERS = ADMINS

DATABASES 
= {
    
'default': {
        
'ENGINE''mysql'
        
'NAME''mydb',                  
        
'USER''me',                     
        
'PASSWORD''secret',             
        
'HOST''localhost',                     
        
'PORT''',                   
    }
}

这样在第一段代码中。可以简化成:

 

from django.db import connection

    cursor = connection.cursor()
    cursor.execute('select name from books')
    names = [row[0] for row in cursor.fetchall()]
    return render_to_response('book_list.html',{'name':names})

 ===============================================================================

下面来说下,用Django的支持做MYSQL的数据模块创建。

 

 1、CMD项目路径下。执行:python manage.py startapp books

books是创建的模块名称,这条命令在项目下创建了一个books目录。

这个目录下包含创建生成的文件:__init__.py,models.py,tests.py,view.py

 2、打开models.py 文件 编辑内容如下:

from django.db import models

class Publisher(models.Model):
    name 
= models.CharField(max_length=30)
    address 
= models.CharField(max_length=50)
    city 
= models.CharField(max_length=60)
    state_province 
= models.CharField(max_length=30)
    country 
= models.CharField(max_length=50)
    website 
= models.URLField()

class Author(models.Model):
    first_name 
= models.CharField(max_length=30)
    last_name 
= models.CharField(max_length=40)
    email 
= models.EmailField()

class Book(models.Model):
    title 
= models.CharField(max_length=100)
    authors 
= models.ManyToManyField(Author)
    publisher 
= models.ForeignKey(Publisher)
    publication_date 
= models.DateField()

 完成这些代码后,激活这个模型。

3、打开settings.py 文件,定位到 INSTALLED_APPS设置节点。

先注释掉里面的自动生成对象。

并添加代码如下:

INSTALLED_APPS = (
    
# 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.sites',
    'mysite.books',
)

 现在我们创建数据库表

 先在CMD中验证 model文件数据是否符合标准。 执行:python manage.py validate

如果显示 0 errors found.表示语法OK。

继续执行  python mange.py sqlall books,这个命令式帮助你生成SQL脚本,你可以复制粘贴到数据库执行操作。

还有一个方法 是直接连到数据库,并执行创建表操作。命令:python manage.py syncdb

 syncdb命令是同步你得模型到数据库。它根据INSTALLED_APPS里设置的APP来检查数据库,如果表不存在,就创建。

 写测试方法:

def createpub(request):
        p1 
= Publisher(name='Apress',address='2855 Telegraph Avenue',city='Berkeley',state_province='CA',country='U.S.A',website='http://www.sina.com.cn')
        p1.save()
        p2 
= Publisher(name='B World',address='2866 Telegraph Avenue',city='Beijing',state_province='CN',country='HK',website='http://www.qq.com')
        p2.save()
        pub 
= Publisher.objects.filter(name='Apress')
        
return render_to_response('book_list.html',{'name':pub})

 写对应的模板页和URLS配置。

运行 效果如下 

[<Publisher: Publisher object>, <Publisher: Publisher object>]

打印出的东西并没有得到我们想要的结果,先来解决这个问题。

修改 models.py 文件内容如下:

class Publisher(models.Model):
    name 
= models.CharField(max_length=30)
    address 
= models.CharField(max_length=50)
    city 
= models.CharField(max_length=60)
    state_province 
= models.CharField(max_length=50)
    country 
= models.CharField(max_length=50)
    website 
= models.URLField()
    
def __unicode__(self):
        
return self.name

    
class Author(models.Model):
    first_name 
= models.CharField(max_length=30)
    last_name 
= models.CharField(max_length=40)
    email 
= models.EmailField()
    
def __unicode__(self):
        
return u'%s %s' % (self.first_name, self.last_name)


    
class Book(models.Model):
    title 
= models.CharField(max_length=100)
    authors 
= models.ManyToManyField(Author)
    publisher 
= models.ForeignKey(Publisher)
    publication_date 
= models.DateField()
    
def __unicode__(self):
        
return self.title

 再运行,输出正常。OBJECTS还有很多操作,这个找对应的文档查看更多。


posted on 2011-07-11 18:23  超级管理员  阅读(501)  评论(0编辑  收藏  举报