命令行颜色
修改的配置的颜色
-
第一个Django应用,数据库模型
-
-
创建一个基本的投票应用,包括2个部分:能够投票,管理站点能增加、修改和删除投票项。
-
该内容适合于 Django 1.7 和 Python 3.2 或更高版本。
-
如果Python版本是2.7,需要做稍微调整。(我安装的就是2.7.8,- -!)
-
-
1.创建项目
-
如果是第一次使用Django,那么需要建立一个django项目来自动生成一些代码,django的实例设置集,包括数据库配置,django的特定选项和特定设置。
-
-
#run as root
-
mkdir /django
-
chown -R normal-user.normal-user /django
-
#as normal-user,进入保存代码的目录(cd /django),然后运行下面的命令:
-
django-admin.py startproject exyz
-
-
会在当前目录建立 exyz 目录,项目名为“exyz”,应避免和django内置项目和组件,比如django和test的名字。
-
startproject 开启项目的结构:
-
exyz/ #项目容器根目录,它的名字可以和项目不一致,可以重命名
-
manage.py #命令行工具,能和django项目进行交互,详细:https://docs.djangoproject.com/en/1.7/ref/django-admin/
-
exyz/ #项目Python包的位置,这个目录名字是项目的名字,导入里面内容方式:exyz.urls 。
-
__init__.py #空文件,告诉Python这个目录是Python包,详细:http://docs.python.org/tutorial/modules.html#packages
-
settings.py #项目的设置和配置,详细:http://docs.python.org/tutorial/modules.html#packages
-
urls.py #URL 规则,详细:https://docs.djangoproject.com/en/1.7/topics/http/urls/
-
wsgi.py #兼容WSGI的web服务的空指针,服务于项目,详细:https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
-
-
2.数据设置
-
默认使用的数据库是SQLite,适合新手用。
-
偷懒就用这个吧,没有改过,如果使用非sqlite,还要事先创建好数据库:
-
DATABASES = {
-
'default': {
-
'ENGINE': 'django.db.backends.sqlite3',
-
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
-
}
-
}
-
时区设置,这样就会获取系统时间,啦啦啦:
-
TIME_ZONE = ''
-
INSTALLED_APPS 设置,应用能在多个项目中使用,如果可以被打包和发布的话。
-
django.contrib.admin – 管理站点.
-
django.contrib.auth – 认证系统.
-
django.contrib.contenttypes – 内容类型框架.
-
django.contrib.sessions – session框架
-
django.contrib.messages – 消息框架.
-
django.contrib.staticfiles – 管理静态文件的框架.
-
这些应用默认是使用在一个常规的项目中。这些应用一部分至少使用一个数据表,所以使用之前要手动创建。
-
#migrate 命令查找 exyz/settings.py INSTALLED_APPS 里的设置来创建需要的表,
-
python manage.py migrate
-
if promot " no mudule named_sqlite3 ",then:
-
yum install sqlite-devel (libsqlite3-dev python-dev )
-
pip install pysqlite
-
-
SQLite语法
-
sqlite3 db.sqlite3 打开sqlite文件
-
.databases 数据库列表
-
.tables 显示表
-
如何从sqlite导出数据呢?
-
sqlite3 some.db .sch > schema
-
sqlite3 some.db .dump > dump
-
grep -v -f schema dump > data
-
sqlite3 -init initf db.sqlite3 .schema > schema.sql ;db.sqlite3 是sqlite文件,schema.sql是导出的sql语句
-
-
#启动项目,以后默认涉及 manage.py 的命令都是在 /django/exyz 目录下执行,默认指定监听本地ip和端口8000
-
python manage.py runserver
-
python manage.py runserver 8080
-
python manage.py runserver 0.0.0.0:8000
-
【切记,django只是一个框架,切勿使用于生产环境中。】
-
*** django 会自动加载runserver,修改代码之后不需要重启,但是添加文件需要重启。
-
-
3.创建模型
-
环境建好了-即项目,下面开始创建应用了。每个应用的基本结构都是由django工具创建的。
-
应用的位置可以放在setting里面设置的任何搜索路径中,我们放在和manage.py同级的目录中,这样可以作为它的最高级别的模型,而不是exyz的子模型。
-
#切换到 manage.py 的同级目录中
-
python manage.py startapp polls
-
-
创建应用的最初是为数据库定义模型,数据结构和必要的元数据。
-
投票应用中使用2个模型:Question 和 Choice。
-
Question 有问题和发布时间;Choice 有2个域,选择项和投票得分。
-
每一个Choice和Question是相关联的。
-
-
polls/models.py
-
from django.db import models
-
-
class Question(models.Model):
-
question_text = models.CharField(max_length=200)
-
pub_date = models.DateTimeField('date published')
-
-
class Choice(models.Model):
-
question = models.ForeignKey(Question)
-
choice_text = models.CharField(max_length=200)
-
votes = models.IntegerField(default=0)
-
每一个模型是由类的子类呈现出来的。每一个模型都有许多类变量,每一个变量都代表这个模型的值、
-
每一个域是由 Field 类实例化的,CharField 是字符域, DateTimeField 是时间域,它告诉django 每个域值的数据类型。
-
Field 实例(比如. question_text 或 pub_date)是实例名,以机器友好的格式。
-
有些 Field 类需要参数,比如 CharField 需要一个 max_length ,不仅仅在数据库设计中,而且在验证中使用。
-
Field 还有可选参数,比如它的默认值为 0。
-
最后,需要定义关系,使用 ForeignKey,告诉django每一个Choice是和Question相关联的。
-
django支持的常见的数据关系:多对一,多对多,一对一。
-
-
4.激活数据库模型
-
激活模型前,需要告诉django模型的存在。
-
exyz/settings.py
-
INSTALLED_APPS = (
-
'django.contrib.admin',
-
'django.contrib.auth',
-
'django.contrib.contenttypes',
-
'django.contrib.sessions',
-
'django.contrib.messages',
-
'django.contrib.staticfiles',
-
'polls',
-
)
-
#将这个模型注册到sqlite数据库中,它的实例可以在 polls/migrations/0001_initial.py 中。
-
python manage.py makemigrations polls
-
-
#migrate 可以用来迁移数据库,sqlmigrate 可以用来看到 migrate 会运行的SQL语句,只是测试不会真正运行。migrate也只是会同步没有被应用的数据库设置。
-
python manage.py sqlmigrate polls 0001
-
python manage.py migrate
-
-
if comes "ImportError: No module named _sqlite3",then need rebuild Python,if build python without "sqlite-devel" before:
-
yum install sqlite-devel
-
build python now..
-
-
#?如何测试正确与否?
-
python manage.py check
-
-
5.测试数据库模型
-
#在manage.py目录下,下面命令会设置让 manage.py 设置 DJANGO_SETTINGS_MODULE 环境变量,让Python导入 exyz/settings.py 文件。
-
python manage.py shell
-
-
#导入之前创建的模型
-
>>> from polls.models import Question, Choice
-
#显示所有数据
-
>>> Question.objects.all()
-
-
#使用数据模型
-
>>> from django.utils import timezone
-
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
-
>>> q.save()
-
>>> q.id
-
>>> q.question_text
-
>>> q.pub_date
-
>>> q.question_text = "What's up?"
-
>>> q.save()
-
>>> Question.objects.all()
-
-
#为了修改django的数据类型,下面文件需要添加些新的内容:
-
polls/models.py
-
from django.db import models
-
-
class Question(models.Model):
-
# ...
-
def __str__(self): # __unicode__ on Python 2
-
return self.question_text
-
-
class Choice(models.Model):
-
# ...
-
def __str__(self): # __unicode__ on Python 2
-
return self.choice_text
-
#添加自定义方法
-
polls/models.py
-
import datetime
-
-
from django.db import models
-
from django.utils import timezone
-
-
-
class Question(models.Model):
-
# ...
-
def was_published_recently(self):
-
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
-
-
#使用数据模型
-
python manage.py shell
-
>>> from polls.models import Question, Choice
-
>>> Question.objects.all()
-
>>> Question.objects.filter(id=1)
-
>>> Question.objects.filter(question_text__startswith='What')
-
>>> from django.utils import timezone
-
>>> current_year = timezone.now().year
-
>>> Question.objects.get(pub_date__year=current_year)
-
>>> Question.objects.get(id=2)
-
>>> Question.objects.get(pk=1)
-
>>> q = Question.objects.get(pk=1)
-
>>> q.was_published_recently()
-
>>> q = Question.objects.get(pk=1)
-
>>> q.choice_set.all()
-
>>> q.choice_set.create(choice_text='Not much', votes=0)
-
>>> q.choice_set.create(choice_text='The sky', votes=0)
-
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
-
>>> c.question
-
>>> q.choice_set.all()
-
>>> q.choice_set.count()
-
>>> Choice.objects.filter(question__pub_date__year=current_year)
-
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
-
>>> c.delete()
阅读(1840) | 评论(0) | 转发(0) |