如何利用另一目录中的python代码 为已创建好的djangopython 创建数据库表添加数据

Django如何在数据库中创建表 - 大搜车-自娱 - ITeye技术网站
博客分类:
1.前提是你安装了Django框架在你的项目中运行Django ZIP文件中的python Setup.py install
2.前提是你已经安装了MySQLdb这个框架在你的项目中1.2.2(直接有EXE文件)
3.前提是你已经安装了PIL-1.1.7.win32-py2.6.exe图片数据库在你的项目中
4.以上准备好之后,创建的Django项目django-admin.py
startproject
5.运行你的Django服务python
runserver,这步完成之后你应该能访问http://localhost:8080了
6.urls.py内存储所有的访问路径,settings.py内存储你的数据库配置
7.以mySQLdb为例配置settings.py
DATABASES = {
'default': {
'ENGINE': 'mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'my',
# Or path to database file if using sqlite3.
'USER': 'root',
# Not used with sqlite3.
'PASSWORD': '123456',
# Not used with sqlite3.
'HOST': 'localhost',
# Set to empty string for localhost. Not used with sqlite3.
'PORT': '3306',
# Set to empty string for default. Not used with sqlite3.
8.挂载你的Django应用,Django必须要有应用挂载,这类似于创建你的web项目,命令为:python manage.py startapp books(创建一个叫books的应用,这样会有一个books的文件夹出现)同时,文件夹内生成了__init__.py以及views.py以及models.py文件,models.py文件这里写你的数据库表的定义
9.models.py内
from django.db import models
class Publisher(models.Model):
name = models.CharField(maxlength=30)
address = models.CharField(maxlength=50)
city = models.CharField(maxlength=60)
state_province = models.CharField(maxlength=30)
country = models.CharField(maxlength=50)
website = models.URLField()
class Author(models.Model):
salutation = models.CharField(maxlength=10)
first_name = models.CharField(maxlength=30)
last_name = models.CharField(maxlength=40)
email = models.EmailField()
headshot = models.ImageField(upload_to='/tmp')
class Book(models.Model):
title = models.CharField(maxlength=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
10.cmd内验证你的数据表(此时只验证错误,数据库表没有创建成功,0errors)
python manage.py validate
python manage.py sqlall books
这里运行这个命令可以生成对应的SQL创建表的语句,但是表仍然没有创建
python manage.py syncdb
此时表终于在数据库中创建出来了
(714.2 KB)
下载次数: 9
MyEyeOfJava
浏览: 539864 次
来自: 北京
浏览量:47977
android可以选择uc浏览器,也可以下载安装证书,原生浏览 ...
你好:Android系统4.4本版以后不能是batteryin ...
为什么不能横屏录制?也即是说如果我的应用是一个横屏的应用,那么 ...
lizhenghuan951 写道哈哈,多谢赞扬。我搜robo ...
哈哈,多谢赞扬。我搜robolectric的资料,不小心逛到你 ...django实例:创建你的第一个应用投票系统(2)数据库的安装
在上一篇中 django实例:创建你的第一个应用投票系统(一)
已经介绍基本的功能,并已经启动服务了。这一节介绍数据库相关的东东。首页打开mysite/settings.py配置文件,设置数据库打到DATABASESENGINE:这个是所要使用的数据库类型,如 postgresql、sqlite、mysql等。如下设置:django.db.backends.mysqlNAME:数据库的名称或者如果你使用的是sqlite的话就是sqlite的路径。&USER :数据库的用户名PASSWORD :数据库密码HOST:数据库地址设置应用APP找到INSTALLED_APPS在这里你看到的这些是django默认的应用django.contrib.auth & 用户认证应用django.contrib.contenttypes & 内容类型应用django.contrib.sessions & session管理应用django.contrib.sites & 管理多个站点的应用django.contrib.messages & 消息处理django.contrib.staticfiles & 静态文件应用下面再介绍一个命令:syncdb这个命令会根据安装的app应用生成相应的数据库表结构、索引等信息。执行方式如下:python manage.py syncdb执行完后 会看到在你设置的数据库中多了几张表,这些表就是django默认安装的应用所生成的表。创建投票系统模型下面先创建投票模型python manage.py startapp polls生成的目录结构如下:polls/
__init__.py
views.py打开polls/models.py 文件,在里面写数据表信息。from django.db import modelsclass Poll(models.Model):
question = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)里面包括两个class,每个class 都是从django的models.Model继承的。class里面的CharField、DateTimeField等用来创建相应的字段类型。如question = models.CharField(max_length=200) 这个就代码创建字符类型的字段,最大长度为200当然CharField、DateTimeField等都是从models.Field继承而来的。如果你想实现自己的数据类型列,也可以从models.Field继承,实现你特定的功能。第一个为投票项,设置了两个字段question:输入问题的字段,pub_date:发布时间字段。第二个为选项,包括三个字段poll:设置选项所对应的投票项choice_text:选项文本votes:投票数现在把我们添加的这个应用添加到 setting.py配置文件中INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
# Uncomment the next line to enable the admin:
# 'django.contrib.admin',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
'polls',)接着执行如下命令:python manage.py sql polls你会看到在cmd命令窗口中会出现创建表的sql语句。执行这个命令仅仅是显示下 django内部根据模型会怎样一步步的来自动创建相应的表的。BEGIN;CREATE TABLE "polls_poll" (
"id" serial NOT NULL PRIMARY KEY,
"question" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL);CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"poll_id" integer NOT NULL REFERENCES "polls_poll" ("id") DEFERRABLE INITIALLY DEFERRED,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL);COMMIT;当然还有几个有关模型的sql命令python manage.py validate & Checks for any errors in the construction of your models.python manage.py sqlcustom polls & Outputs any custom SQL statements (such as table modifications or constraints) that are defined for the application.python manage.py sqlclear polls & Outputs the necessary DROP TABLE statements for this app, according to which tables already exist in your database (if any).python manage.py sqlindexes polls & Outputs the CREATE INDEX statements for this app.python manage.py sqlall polls & A combination of all the SQL from the sql, sqlcustom, and sqlindexes commands.现在我们再执行syncdb,这个时候就会在数据库中看到poll表和choice表了。python manage.py syncdb现在打开shell,在里面进行一些简单的常用的增、删、改、查。python manage.py shell&&& from polls.models import Poll, Choice
# Import the model classes we just wrote.# 获取Poll里面的数据,当然现在是没有的,所以为空&&& Poll.objects.all()[]# 添加一个投票,在这个引入了django里面的关于时间的一个模块。&&& from django.utils import timezone&&& p = Poll(question="What's new?", pub_date=timezone.now())# 保存&&& p.save()# 看看保存之后生成的id及question和pub_date&&& p.id1&&& p.question"What's new?"&&& p.pub_datedatetime.datetime(, 13, 0, 0, 775217, tzinfo=&UTC&)# 修改question,记得要保存&&& p.question = "What's up?"&&& p.save()# 再查看一个&&& Poll.objects.all()[&Poll: Poll object&]在这个我们看到,输出的是&oll: Poll object&这个对象,我们相要的是直接的数据,所以在每个class里面给加上__unicode__()&,来输出相应的内容,其实就相当于c#、java里面的ToString()给重载下。class Poll(models.Model):
def __unicode__(self):
return self.questionclass Choice(models.Model):
def __unicode__(self):
return self.choice_text你可以看看__unicode__()&和&&__str__()的区别我们给Poll class增加一个新的方法import datetimefrom django.utils import timezone# ...class Poll(models.Model):
def was_published_recently(self):
return self.pub_date &= timezone.now() - datetime.timedelta(days=1)下面我们再操作一下。&&& from polls.models import Poll, Choice# Make sure our __unicode__() addition worked.&&& Poll.objects.all()[&Poll: What's up?&]# &&& Poll.objects.filter(id=1)[&Poll: What's up?&]&&& Poll.objects.filter(question__startswith='What')[&Poll: What's up?&]# 根据发布时间来查找数据&&& from django.utils import timezone&&& current_year = timezone.now().year&&& Poll.objects.get(pub_date__year=current_year)&Poll: What's up?&# Request an ID that doesn't exist, this will raise an exception.&&& Poll.objects.get(id=2)Traceback (most recent call last):
...DoesNotExist: Poll matching query does not exist. Lookup parameters were {'id': 2}&&& Poll.objects.get(pk=1)&Poll: What's up?&# 调用我们刚才添加的方法&&& p = Poll.objects.get(pk=1)&&& p.was_published_recently()True# 根据主键来查找数据&&& p = Poll.objects.get(pk=1)&&& p.choice_set.all()[]# 创建三个选项&&& p.choice_set.create(choice_text='Not much', votes=0)&Choice: Not much&&&& p.choice_set.create(choice_text='The sky', votes=0)&Choice: The sky&&&& c = p.choice_set.create(choice_text='Just hacking again', votes=0)# 访问投票项&&& c.poll&Poll: What's up?&# 由poll对象来访问 它关联的选项的所以的集合&&& p.choice_set.all()[&Choice: Not much&, &Choice: The sky&, &Choice: Just hacking again&]&&& p.choice_set.count()3# 查询投票项发布时间是今年的选项&&& Choice.objects.filter(poll__pub_date__year=current_year)[&Choice: Not much&, &Choice: The sky&, &Choice: Just hacking again&]# 查找当前投票中以Just hacking为开头的选项,并删除&&& c = p.choice_set.filter(choice_text__startswith='Just hacking')&&& c.delete()对数据库的访问基本就这些了
最新教程周点击榜
微信扫一扫Django 创建数据库时为什么没有建表blog_blogpost? - 开源中国社区
当前访客身份:游客 [
当前位置:
在学习Django时创建一个blog,在执行./manage.py syncdb命令后按照书上的说法会产生:Creating table blog_blogpost,但是我在执行的时候没有出现:
结果最后导致问题在保存blog的时候出现报错:
请大神指教,谢谢。
共有7个答案
<span class="a_vote_num" id="a_vote_num_
python manager.py syncdb
<span class="a_vote_num" id="a_vote_num_
还有一种方法是删除app目录下的migrations文件夹
<span class="a_vote_num" id="a_vote_num_
先加app到INSTALLED_APPS,之后再syncdb
<span class="a_vote_num" id="a_vote_num_
引用来自“pitttttttt”的评论
django1.7?
use&makemigrations and&migrate instead of syncdb
我只想说django这种修改真操蛋
--- 共有 2 条评论 ---
: 恩,这样将同步分成两个步骤来操作,比较灵活
(2年前)&nbsp&
想想他们为什么这样做?我觉得太漂亮了。
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
django1.7?
use&makemigrations and&migrate instead of syncdb
--- 共有 1 条评论 ---
(2年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
嗯,楼上说的有道理,加入之后再同步一次数据库
<span class="a_vote_num" id="a_vote_num_
要先把app名加到setting.py中的INSTALLED_APPS = ()中
更多开发者职位上
有什么技术问题吗?
Frianki...的其它问题
类似的话题developerWorks 社区
Django 是一种 Python Web 框架,由对象关系映射器 (ORM)、后端控制器和模板系统组成。MongoDB 是一种面向文档的数据库(也称为 NoSQL 数据库),能有效地进行扩展并提供高性能。在本文中,我们将学习如何从 Python 调用 MongoDB(使用 MongoEngine),以及如何将它集成到 Django 项目中以代替内置的 ORM。本文还包括用来为 MongoDB 后端创建、读取和更新数据的样例 Web 界面。
, 顾问, 自由职业
Cesar Otero 是一名 Java 和 Python 顾问。他具有电气工程学位并兼修了数学。
Django 是在一个极为出色的模块化样式中得到应用的;替换一个基于 Django 的 Web 应用程序的不同组件非常简单。由于 NoSQL 目前较为常见,您可能想要尝试运行一个具有不同后端而非具有标准关系数据库(如 MySQL&#174;)的应用程序。在本文中,您将初体验 MongoDB,包括如何使用 PyMongo 或 MongoEngine 在您的 Python 项目中调用它。接着,您将使用 Django 和 MongoEngine 创建一个可执行创建、读取、更新、删除 (CRUD) 操作的简单博客。关于 NoSQL 数据库 根据 nosql-database.org,NoSQL 数据库是 “下一代数据库,主要具有以下几个要点:非关系型、分布式、开放源码和可水平伸缩”。面向文档的数据库 MongoDB 就是这种类型的数据库。 从一种新的角度来看,Django 1.3 包含了对 SQLite、MySQL、PostgreSQL 和 Oracle 的支持,但是并不包含对 MongoDB 的支持。不过,要添加对 MongoDB 的支持非常容易,但要以失去自动管理面板为代价。因此,您必须根据您的需要进行权衡。MongoDB 简介 MongoDB 可以充当 JavaScript 解释器,因此数据库操作是通过 JavaScript 命令完成的。在您的机器上本地安装 MongoDB 后(参见 ),可以尝试使用
中列出的一些命令。清单 1. 您可以尝试对 MongoDB 使用的样例 JavaScript 命令var x = "0";
typeof({}); 您不必成为一名 JavaScript 专家之后才开始使用 MongoDB;这里提供几个有用的概念:您可以使用对象字面量语法 (object literal syntax) 创建对象,换句话说,会使用两个花括号(如 var myCollection = {};)。您可以使用方括号([])来创建数组。除了数字、布尔值、null 和未定义值以外,JavaScript 中的其他所有值都是一个对象。 如果您想要了解关于 JavaScript 其他特性的更多信息,比如原型的面向对象的编程 (OOP)、范围规则,及其函数式编程特性,请参阅 。 MongoDB 是一种无模式数据库,与关系型数据库完全相反。无模式数据库没有使用表格,而是使用由文档组成的集合。这些文档是使用对象字面量语法创建的,如
所示。清单 2. 文档创建示例var person1 = {name:"John Doe", age:25};
var person2 = {name:"Jane Doe", age:26, dept: 115}; 现在,请执行
中所示的命令来创建一个新集合。清单 3. 创建集合db.employees.save(person1);
db.employees.save(person2); 由于 MongoDB 具有无模式特性,所以 person1 和 person2 不必具有相同的列类型,甚至不必拥有相同的列编号。并且,MongoDB 本身具有动态特性,所以它会创建 employees 而不是抛出一个错误。您可以通过 find() 方法检索文档。要获取 employees 中的所有文档,可以直接调用 find(),无需使用任何参数,如
所示。清单 4. 一个简单的 MongoDB 查询& db.employees.find();
// returns
"$oid" : "4e363c4dccfa1"
"name" : "John Doe",
"age" : 25
"$oid" : "4e363c53ccfa2"
"name" : "Jane Doe",
"dept" : 115,
"age" : 26
] 注意,_id 等效于一个主键。要运行具体的查询,则需要使用键/值对传递另一个对象来指示您所要查询的内容,如
所示。清单 5. 通过一个搜索参数进行查询& db.employees.find({name: "John Doe"});
// returns
"$oid" : "4e363c4dccfa1"
"name" : "John Doe",
"age" : 25
] 要查询年龄大于 25 岁的员工,请执行
中的命令。清单 6. 查询年龄大于 25 岁的员工& db.employees.find({age:{'$gt':25}});
// returns
"$oid" : "4e363c53ccfa2"
"name" : "Jane Doe",
"dept" : 115,
"age" : 26
]$gt 是一个特殊操作符,表示大于。 列出了其他修饰符。表 1. 可以对 MongoDB 使用的修饰符修饰符描述$gt大于 $lt小于$gte大于或等于$lte小于或等于$in检查某个数组是否存在,类似于 'in' SQL 操作符。 当然,您也可以使用 update() 方法更新记录。您可以更新整条记录,如
所示。清单 7. 更新整条记录& db.employees.update({
name:"John Doe",
// Document to update
{name:"John Doe", age:27} // updated document
}); 此外,您还可以使用 $set 操作符仅更新一个值,如
所示。清单 8. 仅更新记录中的一个值& db.employees.update({name:"John Doe",
{ '$set': {age:27} }
}); 要清空集合,可以调用 remove() 方法,无需使用任何参数。例如,如果您想要从 employees
集合中移除 John Doe,那么您可以执行
所示的操作。清单 9. 从 employees 集合中移除 John Doe& db.employees.remove({"name":"John Doe"});
& db.employees.find();
// returns
"$oid" : "4e363c53ccfa2"
"name" : "Jane Doe",
"dept" : 115,
"age" : 26
] 此内容对于刚开始使用 MongoDB 的您来说已经足够了。当然,您可以继续浏览官方网站,该网站提供了简洁的、基于 Web 的交互式 mongodb 命令提示符,以及指南和官方文档。请参阅 。将 Django 与 MongoDB 集成
有几个从 Python 或 Django 访问 MongoDB 的选项。第一个选项是使用 Python 模块,即 PyMongo。 是一个简单的 PyMongo 会话,假设您已经安装了 MongoDB,并且已经拥有一个在端口上运行的实例。清单 10. 样例 PyMongo 会话from pymongo import Connection
databaseName = "sample_database"
connection = Connection()
db = connection[databaseName]
employees = db['employees']
person1 = { "name" : "John Doe",
"age" : 25, "dept": 101, "languages":["English","German","Japanese"] }
person2 = { "name" : "Jane Doe",
"age" : 27, "languages":["English","Spanish","French"] }
print "clearing"
employees.remove()
print "saving"
employees.save(person1)
employees.save(person2)
print "searching"
for e in employees.find():
print e["name"] + " " + unicode(e["languages"]) PyMongo 允许您同时运行多个数据库。要定义一个连接,只需将数据库名字传递给连接实例。在本例中,Python 词典代替了 JavaScript 对象字面量来创建新文档定义,而 Python 列表代替了 JavaScript 数组。find 方法会返回一个您可以进行迭代的数据库游标对象。 语法的简易性使 MongoDB 命令行与包含 PyMongo 的运行命令之间的切换变得容易。例如, 展示了如何使用 PyMongo 运行一个查询。 清单 11. 使用 PyMongo 运行一个查询for e in employees.find({"name":"John Doe"}):
print e 您从 Python 调用 MongoDB 的另一个选项是 MongoEngine,如果您使用过 Django 的内置 ORM,那么您对此应该感到非常熟悉。MongoEngine 是一个文档到对象的映射器,从概念上说,它与映射到 ORM 的映射器类似。 显示了一个使用 MongoEngine 的示例会话。 清单 12.
MongoEngine 示例会话from mongoengine import *
connect('employeeDB')
class Employee(Document):
name = StringField(max_length=50)
age = IntField(required=False)
john = Employee(name="John Doe", age=25)
john.save()
jane = Employee(name="Jane Doe", age=27)
jane.save()
for e in Employee.objects.all():
print e["id"], e["name"], e["age"]Employee 对象继承自 mongoengine.Document。在本示例中,使用了两种字段类型:StringField 和
IntField。与 Django 的 ORM 相似,要通过查询获得集合中的所有文档,请调用 Employee.objects.all()。请注意,要访问惟一的对象 ID,请使用 "id" 而非
"_id"。一个样例博客 现在要创建一个名为 Blongo 的简单博客。您将使用 Python 1.7、Django 1.3、MongoDB 1.8.2、MongoEngine 0.4 和 Hypertext Markup Language
(HTML) 5。如果您想要重现我的精确设置,我习惯使用 Ubuntu Linux 和 FireFox。Blongo 在网页加载后就会显示所输入的所有博客条目,并且允许对任何条目执行更新和删除操作,换句话说,允许进行所有的标准 CRUD 操作。Django 视图拥有三个方法:index、update 和
delete。 层叠样式表 (CSS) 定义被引入一个单独的静态文件。相关内容我不想在此处赘述,您可以随意浏览
部分中包含的源代码。 假设已安装好所需的所有工具,并且这些组件都能良好运行,那么请创建一个新的 Django 项目和必要的组件,如
所示。清单 13. 创建 Django 博客项目的命令$ django-admin.py startproject blongo
$ cd blongo
$ django-admin.py startapp blogapp
$ mkdir templates
$ cd blogapp
$ mkdir staticDjango 1.3 的新增内容是一个已包含在 Django 中的贡献型应用程序,可使用它来改进静态文件的处理。通过向任何应用程序目录添加一个静态目录(例如,本例中的 blogapp)并确保 django.contrib.staticfiles 包含在已安装应用程序中,Django 可以查找到诸如 .css 和 .js 的静态文件,而无需使用其他任何方法。 显示了设置文件的代码行,这些代码行已经进行了相应修改(来自默认的 settings.py 文件),使博客应用程序能够正常运行。清单 14. 已改变的设置文件代码行(来自默认的 settings.py 文件)# Django settings for blog project.
APP_DIR = os.path.dirname( globals()['__file__'] )
DBNAME = 'blog'
TEMPLATE_DIRS = (
os.path.join( APP_DIR, 'templates' )
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.blogapp',
) 本项目中也有三个模板:index.html、update.html 和 delete.html。 显示了这三个模板文件的代码。清单 15. index.html、update.html 和 delete.html 模板文件的代码
&!-- index.html --&
&!DOCTYPE html&
&link href="{{STATIC_URL}}blog.css" rel="stylesheet" type="text/css"&
&h1&Blongo&/h1&
&form method="post" action="http://127.0.0.1:8000/"&
{% csrf_token %}
&input type="text" name="title" placeholder="Post Title" required&
&textarea name="content" placeholder="Enter Content" rows=5 cols=50 required&
&/textarea&
&input type="submit" value="Add Post"&
&!-- Cycle through entries --&
{% for post in Posts %}
&h2& {{ post.title }} &/h2&
&p&{{ post.last_update }}&/p&
&p&{{ post.content }}&/p&
&form method="get" action="http://127.0.0.1:8000/update"&
&input type="hidden" name="id" value="{{ post.id }}"&
&input type="hidden" name="title" value="{{ post.title }}"&
&input type="hidden" name="last_update" value="{{ post.last_update }}"&
&input type="hidden" name="content" value="{{ post.content }}"&
&input type="submit" name="" value="update"&
&form method="get" action="http://127.0.0.1:8000/delete"&
&input type="hidden" name="id" value="{{post.id}}"&
&input type="submit" value="delete"&
{% endfor %}
&!-- update.html --&
&!DOCTYPE html&
&link href="{{STATIC_URL}}blog.css" rel="stylesheet" type="text/css"&
&h1&Blongo - Update Entry&/h1&
&form method="post" action="http://127.0.0.1:8000/update/"&
{% csrf_token %}
&li&&input type="hidden" name="id" value="{{post.id}}"&&/li&
&input type="text" name="title" placeholder="Post Title"
value="{{post.title}}" required&
&input type="text" name="last_update"
value="{{post.last_update}}" required&
&textarea name="content" placeholder="Enter Content"
rows=5 cols=50 required&
{{post.content}}
&/textarea&
&input type="submit" value="Save Changes"&
&!-- delete.html --&
&!DOCTYPE html&
&link href="{{STATIC_URL}}blog.css" rel="stylesheet" type="text/css"&
&h1&Blongo - Delete Entry&/h1&
&form method="post" action="http://127.0.0.1:8000/delete/"&
{% csrf_token %}
&input type="hidden" name="id" value="{{id}}"&
&p&Are you sure you want to delete this post?&/p&
&input type="submit" value="Delete"&
&/html& 接着,更改
中所示代码的 URL 映射,该映射指向索引、更新和删除的视图。您可能想让样例博客创建新的博客条目(在索引中)、更新现有博客帖子,并在想要删除这些帖子的时候删除它们。每个操作都是通过向特定 URL 发送一个请求来完成的。清单 16. 索引、更新和删除的映射from django.conf.urls.defaults import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'blog.blogapp.views.index'),
url(r'^update/', 'blog.blogapp.views.update'),
url(r'^delete/', 'blog.blogapp.views.delete'),
) 注意,您无 需运行 syncdb Django 命令。要将 MongoDB 集成到您的应用程序中,只需使用 MongoEngine 即可。在 blogapp 目录的 models.py 文件中,添加
中所示的代码。清单 17. 在数据层中包含 MongoEnginefrom mongoengine import *
from blog.settings import DBNAME
connect(DBNAME)
class Post(Document):
title = StringField(max_length=120, required=True)
content = StringField(max_length=500, required=True)
last_update = DateTimeField(required=True)数据库名称是源自设置文件,用于分隔关注点。每个博客帖子都包含三个必要的字段:title、content 和
last_update。如果您将此清单与您通常在 Django 获得的清单进行对比,就会发现它们差别并不大。此清单使用了 mongoengine.Document 类,而非从 django.db.models.Model 中继承的类。在这里,我并不打算深入探讨数据类型之间的差别,但您可以随意查看 MongoEngine 文档(参见 )。 列出了 MongoEngine 字段类型,并显示了对等的 Django ORM 字段类型(如果存在的话)。 表 2. MongoEngine 字段类型和 Django ORM 对等物MongoEngine 字段类型Django ORM 对等物StringFieldCharFieldURLFieldURLFieldEmailFieldEmailFieldIntFieldIntegerFieldFloatFieldFloatFieldDecimalFieldDecimalFieldBooleanFieldBooleanFieldDateTimeFieldDateTimeFieldEmbeddedDocumentFieldNoneDictFieldNoneListFieldNoneSortedListFieldNoneBinaryFieldNoneObjectIdFieldNoneFileFieldFileField最后,您可以创建自己的视图。在这里,您拥有三个视图方法:index、update 和
delete。要执行想要执行的操作,则必须向特定 URL 发送一个请求。例如,要更新一个文档,则必须向 localhost:8000/update 发送一个请求。执行一个 http
'GET' 请求不会执行保存、更新等操作。新博客帖子是从索引视图插入的。 显示了索引、更新和删除视图的实现。清单 18. Django 视图from django.shortcuts import render_to_response
from django.template import RequestContext
from models import Post
import datetime
def index(request):
if request.method == 'POST':
# save new post
title = request.POST['title']
content = request.POST['content']
post = Post(title=title)
post.last_update = datetime.datetime.now()
post.content = content
post.save()
# Get all posts from DB
posts = Post.objects
return render_to_response('index.html', {'Posts': posts},
context_instance=RequestContext(request))
def update(request):
id = eval("request." + request.method + "['id']")
post = Post.objects(id=id)[0]
if request.method == 'POST':
# update field values and save to mongo
post.title = request.POST['title']
post.last_update = datetime.datetime.now()
post.content = request.POST['content']
post.save()
template = 'index.html'
params = {'Posts': Post.objects}
elif request.method == 'GET':
template = 'update.html'
params = {'post':post}
return render_to_response(template, params, context_instance=RequestContext(request))
def delete(request):
id = eval("request." + request.method + "['id']")
if request.method == 'POST':
post = Post.objects(id=id)[0]
post.delete()
template = 'index.html'
params = {'Posts': Post.objects}
elif request.method == 'GET':
template = 'delete.html'
params = { 'id': id }
return render_to_response(template, params, context_instance=RequestContext(request)) 您可能已经注意到用来索引文档 ID 的 eval 语句。使用该语句是为了避免编写
中所示的 if 语句。清单 19. 检索文档 ID 的替代方法
if request.method == 'POST':
id = request.POST['id']
elif request.method == 'GET':
id = request.GET['id'] 您也可以这样编写代码。以上就是创建并运行一个简单博客需要执行的所有操作。显然,最终产品中还会添加许多组件,比如用户、登录、标签等。结束语 正如您所看到的,从 Django 调用 MongoDB 真的不是很复杂。在本文中,我简单介绍了一下 MongoDB,并解释了如何访问它,以及如何通过 PyMongo 包装器和 MongoEngine 的 “对象至文档” 映射器,从 Python 操作 MongoDB 的集合和文档。最后,我快速演示了如何使用 Django 执行基础 CRUD 操作。虽然这只是第一步,但是希望您现在能够了解如何将此设置应用到您自己的项目中。
下载描述名字大小使用 MongoEngine 的 Django 应用程序样例12KB
参考资料 从 Mozilla 提供的教程 "" 和 Douglas Crockford 撰写的书籍 (O'Reilly Media/Yahoo Press,2008 年 5 月)中了解关于 JavaScript 的更多内容。 关注 。 观看 ,从初学者的产品安装和配置演示,到面向有经验开发人员的高级功能。随时关注 developerWorks 和。
访问 developerWorks 获得丰富的 how-to 信息、工具和项目更新以及,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。 了解并下载 。 下载并探索 。 访问
网站获取相关的下载和文档。 查看 。 深入讨论 。:下载产品试用版,在线试用产品,在云环境下试用产品,或者在
中花费几个小时来学习如何高效实现面向服务架构。加入 ,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。加入 ,参与在线交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Open sourceArticleID=810210ArticleTitle=结合使用 MongoDB 和 Djangopublish-date=

我要回帖

更多关于 django 创建数据库 的文章

 

随机推荐