设为首页 收藏本站
查看: 1046|回复: 0

[经验分享] 【翻译】编写第一个Django app,第二部分——创建模型和使用模型

[复制链接]

尚未签到

发表于 2016-11-22 08:51:07 | 显示全部楼层 |阅读模式
创建模型
  现在你的运行环境——"project"——已经建好了,现在准备让它开始工作了。
  你在Django中写的每一个应用程序都是由Python包组成,它们都在Python的路径下,遵循一定的约定。
  Django自带有一个实用的工具,自动生成app的基本目录结构,因些,你可以把更多的精力放在代码的编写上而不是创建目录上。
Projects vs. apps(项目与应用程序)
project和app之间有什么不同之处呢?一个app是实现某种功能的Web应用程序——例如,一个网络博客系统,一个公共记录的数据库或一个简单的投票程序。一个project是具体网站app和配置的集合。一个project可以包含多个apps。一个app可以在多个project中。
在本教程中,我们将会在mysite文件夹中简单地创建我们的poll app。因而,这个app属于这个project——mysite,在poll app中的python代码相当于mysite.polls。在本程序后面,我们会讨论发布您的apps时的解耦。
  要创建你的app,先要确保你是在mysite文件夹中,然后输入这些命令:
  python manage.py startapp polls
  它们将会创建一个polls文件夹,里面的内容是:
  polls/
  __init__.py
  models.py
  views.py
  这个目录结构就是app应用程序。
  编写数据库Web应用程序的第一步是定义你的模型层——基本上就是你的数据库的布局,但添加了些额外的元数据。
  在我们的简单的poll app中,我们将会创建两个模型:polls和choices。poll包含question和publication date。choise有两个字段:选择的文字和投票记分。每个choise都和一个poll关联。
  这些概念可以用简单的Python类来描述。把文件polls/models.py编辑成如下面的样子:
  from django.db import models
  class Poll(models.Model):
      question = models.CharField(max_length=200)
      pub_date = models.DateTimeField('date published')
  class Choice(models.Model):
      poll = models.ForeignKey(Poll)
      choice = models.CharField(max_length=200)
      votes = models.IntegerField()
  关于max_length的错误
  如果Django给你一个错误信息提示max_length不是正确的参数,你很可能使用的是旧版的Django。(本教程是针对Django最新的开发版本写的)(顺便说一下,旧版使用的参数是maxlength)。
  这些代码都比较简单直观。每个模型都对应一个类,它是django.db.models.Model的子类。每个模型都包含有一些类级变量,它们代表数据库的字段。
  每个字段都是Field类的实例——如,CharField是character字段,DateTimeField是日期字段。这些变量告诉Django字段保存的数据类型。
  Field实例名(如question或pub_date)是字段的名字,使用机器友好的格式。你可以在Python代码中使用它们,也可以在数据库中作为列名使用。
  你可以使用第一个可选的参数来定义Field的人性化的名字。它在Django中作为提示的内容。如果这个字段没有提供,Django将使用对机器易读的名字。在这个例子中,我们只为Poll.pub_date定义了人性化的名字。模型中的其它字段都是使用对机器易读,对人不易阅读的名字。
  一些Field类需要参数。例如CharField,需要你给出max_length。它不仅是用于数据库的架构信息中,还用于数据验证,等会我们就会看到了。
  最后,关注一下关联的定义,使用ForeignKey。它告诉Django每个Choice和一个Poll关联。Django提供有所有常用的数据库关联:多对一,多对多,一对一。
使用模型
  这些少量的模型代码给了Django大量的信息。通过它,Django能够做这些事情:
  1.为这个app创建数据库的架构信息(CREATE TABLE 声明)。
  2.创建Python的数据库访问API来获取Poll和Choice对象。
  但首先,我们要告诉我们的project,polls app已经安装好了。
  再次编辑settings.py文件,修改INSTALLED_APPS的设置,加入字符吕'mysite.polls'。这样,它的代码看起来如下:
  INSTALLED_APPS = (
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.sites',
      'mysite.polls'
  )
  现在,Django已经知道了mysite中包含有polls app。让我们运行另一个命令:
  python manage.py sql polls
  你应该会看到一些类似于下面的信息(polls app的CREATE TABLE SQL描述语句)
  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"),
    "choice" varchar(200) NOT NULL,
    "votes" integer NOT NULL
);
COMMIT;
  注意以下各项:
  1.这些输出依赖于你所使用的数据库。
  2.表名是自动生成的,由app(polls)名和模型名的小写组成——poll和choice。(你可以重写这个行为)
  3.主键(IDs)是自动添加的。(这个你也可以重写)
  4.为了方便,Django在外键字段名后面加上"_id"。你也可以重写这个。
  5.外键关系使用显式的REFERENCES声明。
  6.它根据你使用的数据库做不同的调整,因些一些特殊的字段类型,如auto_increment(MySQL),serial(PostgreSQL),或integer primary key(SQLite)
  都会为你自动处理。相同地,对于引号也是如此。——如,使用单引号或双引号。本教程的作者使用的是PostgreSQL,因此例子中输出的是使用
  PostgreSQL的语法。
  7.这些sql命令并不是运行在数据库的实际的SQL,它只是打印在屏幕上,因些你能看到Django认为需要使用什么SQL语句。如果你愿意,你可以copy
  并粘贴这些SQL到你的数据库提示框中。然而,很快你就会看到,Django提供了更简单的方法来向数据库执行这些SQL语句。
  如果你有兴趣,你还可以运行下面的命令:
  1.python manage.py validate —— 检查模型的结构上是否有错误。
  2.python manage.py sqlcustom polls —— 输出所有在应用程序中定义的自定义SQL描述(如表的限制或约束)。
  3.python manage.py sqlclear polls —— 输出在这个app中删除已存在的表的DROP TABLE描述。
  4.python manage.py sqlall polls —— 一个组合所有的sql,sqlcustom和sqlindexes的SQL命令.
  从这些输出的命令中能帮助我们了解在自动生成引擎下实际做了些什么事情。
  现在,再次运行syncdb在你的数据库中创建这些模型的表。
  python manage.py syncdb
  syncdb命令在你的数据库中运行从'sqlall'中得来的sql命令,它只运行在INSATLLED_APPS中,还没有保存存在你的数据库中的apps。
  它创建所有的表,初始化数据和索引你最后一次运行syncdb时你已经添加到你的工程中的apps。syncdb你想运行多少次都可以,
  它只创建还没有存在的表。
  因为第一次翻译英文资料,计算机术语了解得不多,英语水平也不行,翻译得不够准确的地方还请多多包涵。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303767-1-1.html 上篇帖子: NBearLite使用入门 下篇帖子: 【转】基于GeoServer的电子地图系统说明(六):用OpenLayers实现WebGIS客户端
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表