Django使用步骤
文章目录
一、准备阶段
- 重要的一点:windows上本地网路ip需要再seetings中直接声明,但在unbutu中只需["*"]即可。
两者均不需要关闭防火墙(unbutu应该没有防火墙)
- 查看版本
python -m django --version - 创建项目
django-admin startproject mysite
以上步骤在Pychram中均可省略 - 简单测试
python manage.py runserver
这里可以更改自己想要的ip及端口
如:
python manage.py runserver 8080 - 创建app
python manage.py startapp polls - 在settings中加入此app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'MMS', # 后面加入的
]
- 在新建的app中编写第一个用于测试的views
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
- 在主目录的urls.py下添加我们的views的url
from django.contrib import admin
from django.urls import path
from MMS import views as MMS_views
urlpatterns = [
path('admin/', admin.site.urls),
path('',MMS_views.index), # news
]
二、开始加入真正的功能
- 在settings中更换mysql的信息
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'csvt',
'USER':'root',
'PASSWORD':'123456',
'HOST': '127.0.0.1',
'PORT': '3306',
}
- 添加驱动
django 连接mysql默认驱动是MySQLdb,MySQLdb没有支持python3的版本,解决办法如下:
- 使用pymysql替换MySQLdb
在django 项目配置文件同目录下的 --init__.py文件中加入以下代码:
import pymysql
pymysql.install_as_MySQLdb()
- 使用mysqlclient代替MySQLdb
pip install mysqlclient
- 默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。请执行以下命令:
python manage.py migrate - 创建数据库
在app的modles.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, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
- 现在你的 Django 项目会包含 polls 应用。接着运行下面的命令:
python manage.py makemigrations polls
你将会看到类似于下面这样的输出:
Migrations for ‘polls’:
polls/migrations/0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
迁移是 Django 对于模型定义(也就是你的数据库结构)的变化的储存形式 - 没那么玄乎,它们其实也只是一些你磁盘上的文件。如果你想的话,你可以阅读一下你模型的迁移数据,它被储存在polls/migrations/0001_initial.py
里。别担心,你不需要每次都阅读迁移文件,但是它们被设计成人类可读的形式,这是为了便于你手动修改它们。
Django 有一个自动执行数据库迁移并同步管理你的数据库结构的命令 - 这个命令是migrate
,我们马上就会接触它 - 但是首先,让我们看看迁移命令会执行哪些 SQL 语句。sqlmigrate
命令接收一个迁移的名称,然后返回对应的 SQL:
$ python manage.py sqlmigrate polls 0001
- 现在,再次运行
migrate
命令,在数据库里创建新定义的模型的数据表:
python3 manage.py migrate
以上3、4、5、6合起来如下:
# 初始化
python manage.py migrate
# 在modles中创建新的表
# 执行一下步骤
python manage.py makemigrations polls
# 将表加入如数据
python manage.py migrate
- 还要学习一下python方便的API
现在让我们进入交互式 Python 命令行,尝试一下 Django 为你创建的各种 API。通过以下命令打开 Python 命令行:
python manage.py shell
我们使用这个命令而不是简单的使用 “Python” 是因为 manage.py
会设置 DJANGO_SETTINGS_MODULE
环境变量,这个变量会让 Django 根据 mysite/settings.py
文件来设置 Python 包的导入路径。
当你成功进入命令行后,来试试 database API 吧:
from polls.models import Choice, Question
# Import the model classes we just wrote.
# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>
>>> from django.utils import timezone
# 为表添加元素
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# 保存
>>> q.save()
# Now it has an ID.
>>> q.id
1
# Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save()
# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
等等。<Question: Question object (1)>
对于我们了解这个对象的细节没什么帮助。让我们通过编辑 Question
模型的代码(位于 polls/models.py
中)来修复这个问题。给 Question
和 Choice
增加 __str__()
方法。
polls/models.py
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
给模型增加 __str__()
方法是很重要的,这不仅仅能给你在命令行里使用带来方便,Django 自动生成的 admin 里也使用这个方法来表示对象。
**注意:这些都是常规的 Python方法。让我们添加一个自定义的方法,这只是为了演示:
polls/models.py
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)
三、外键与主键
还没有写完(😅😅)