django (三) 第一个django app 创建model
经过上一章,我们已经创建好一个django app了,接下来,我们开始完善它。
首先,我们先了解些基本概念。
Django中创建的每个应用程序都是由Python的包组成,遵循某些约定。Django配有一个实用程序,自动生成一个应用程序的基本目录结构,所以您可以专注于编写代码,而不是创建目录。
那么项目和应用程序到底有什么区别呢?
一个app是一个web应用:比如一个博客系统,一个简单的投票系统。而一个项目是一个集合的配置和应用程序特定的Web站点。一个项目可以包含多个应用程序。应用程序可以存在于在多个项目。
应用程序可以放置在任何Python路径下。在本文中,我们将应用与manage.py文件放在同一个目录下,以便它可以作为一个顶级模块,而不是为mysite的子模块。
所以首先,我们进入到manage.py的同级目录下,也就是C:\mysite,输入下面的命令:
manage.py startapp polls
polls的目录结构如下:
polls/
__init__.py
models.py
tests.py
views.py
写数据库Web应用程序的第一步就是定义模型,从本质上讲就是用一些额外的元数据,定义数据库布局。模型需要对必要字段和数据行为进行定义。
在我们的程序中,我们需要建立两个模型:Poll 和 Choice,Poll包含提问和提问的日期,Choice包含投票的选项和票数的统计,每一个Choice都与一个Poll相关联。
下面修改polls/models.py:
# -*- coding: utf-8 -*- 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_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
这里的代码很直观,每一个model都代表了django.db.models.Model的子类,每一个model都有一些变量,用来定义数据的类型与范围。
每一个变量都是一个字段的实例,CharField表示字符串字段,DateTimeField表示日期字段,每个字段实例(如question或pub_date)在数据库中代表一列。你可以在第一个参数位置字段输入一个字符串,告诉人们这个变量的含义,比如‘date published‘。有些变量你需要给他设置一些初始参数。比如IntegerField。表与表之间会有一些外键,可以用ForeignKey去设置。Django里的外键有many-to-ones, many-to-manys and one-to-ones.
这些代码将告诉Django做以下事情:
- 为这个应用创建数据结构(为这些表创建声明) .
- 为Poll和Choice等对象创建数据接口。
做这些之前,我们首先得告诉程序,Poll应用已经建好了。修改setting.py里的INSTALLED_APPS,向里面添加polls如下:
INSTALLED_APPS = ( ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.sites‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘polls‘ # Uncomment the next line to enable the admin: # ‘django.contrib.admin‘, # Uncomment the next line to enable admin documentation: # ‘django.contrib.admindocs‘, )
现在,程序知道polls应用已经安好,下面来执行另外一个命令:
manage.py sql polls
出现如下内容:
BEGIN; CREATE TABLE "polls_poll" ( "id" integer NOT NULL PRIMARY KEY, "question" varchar(200) NOT NULL, "pub_date" datetime NOT NULL ) ; CREATE TABLE "polls_choice" ( "id" integer NOT NULL PRIMARY KEY, "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"), "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL ) ; COMMIT;
让我们来解释一下它:
这里的polls_poll 和 polls_choice都是系统根据model里的变量自动生成的,由于我们没有设置主键,所以系统将主键设置为id.
sql命令并没有真的去数据库中执行SQL语句——它只是打印到屏幕上,这样你可以看到SQL Django认为是必需的。
下面介绍几个命令:
manage.py validate
用来检查模型是否正确。
manage.py sqlcustom polls
输出任何自定义SQL语句(如表的修改或为应用程序定义的约束)。
manage.py sqlclear polls
为这个应用程序输出必要的DROP TABLE语句,根据哪些表已经存在于您的数据库(如果有的话)。
manage.py sqlindexes polls
为这个应用程序输出CREATE INDEX语句。
manage.py sqlall polls
上述所有命令的集合。
现在,可以为这些模型创建表了,执行:
manage.py syncdb
注意,这个命令只会为没有创建过表app去创建新表。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。