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去创建新表。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。