Django
准备:
作者编辑环境:Pycharm python3.7 Django3.1.1
创建一个Django 项目,并且创建一个应用 例如:
–python manage.py startapp polls
创建一个应用 polls
1.1 连接mysql
(1)在项目根目录中的__init__.py中加入
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
(2) 在项目根目录中的setting.py中配置DATABASES变量,例:
注:安装需求更改时区 TIME_ZONE = ‘Asia/Shanghai’
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',#选择mysql
'NAME': 'Django',#数据库表名
'HOST': '127.0.0.1',#数据库主机名
'PORT': '3306',#数据库端口号
'USER': 'root',#连接数据库用户名
'PASSWORD': ''#密码
}
}
(3)在manange.py目录控制台下运行
python manage.py migrate
官方说明:这个 migrate
命令检查 INSTALLED_APPS
设置,为其中的每个应用创建需要的数据表,至于具体会创建什么,这取决于你的 mysite/settings.py
设置文件和每个应用的数据库迁移文件。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
理解:可以通过创建数据模型的方法描述数据库,从而自动生成适配多种数据库的SQL语句,并应用。
根据配置自动创建对应的数据库(类似将不同数据库的标准统一成一种数据描述方式)
(4)创建数据模型
描述所需的数据模型 例:
在这个投票应用中,需要创建两个模型:问题 Question
和选项 Choice
。Question
模型包括问题描述和发布时间。Choice
模型有两个字段,选项描述和当前得票数。每个选项属于一个问题。
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, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
(5)激活模型
-
先得把
polls
应用安装到我们的项目里项目名称/setting.py
INSTALLED_APPS = [ 'polls.apps.PollsConfig',#安装polls 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
-
运行 –
python manage.py makemigrations polls
结果过:
Migrations for ‘polls’:
polls\migrations\0001_initial.py Create model Question
Create model Choice
生成数据模型 为
polls\migrations\0001_initial.py
-
运行
py manage.py sqlmigrate polls 0001
查看定义的模型:
-
-
运行
py manage.py migrate
应用到数据库:
(base) D:\items\python\pythonWeb\mysist02>py manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations: Applying polls.0001_initial... OK
结果:
polls_question表
polls_choice表
(6)表操作实例:
控制台运行 python manage.py shell
作用:进入如下的python命令行交互模式
已下内容出现 >>> 即需要在这么模式下进行
>>> from polls.models import Choice, Question #导入我们刚写的数据模型类
>>> Question.objects.all()#查看现在的Question模型的实例
<QuerySet []>#目前为0个
>>> from django.utils import timezone #导入巴拉巴拉类
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
#创建一个Question模型的实例
>>> q.save() # 调用save方法保存数据
#查看实例的数据
>>> q.id
1
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
#修改数据并保存
>>> q.question_text = "What's up?"
>>> q.save()
# 查看所有的Question模型的实例
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
(7) 给 Question
和 Choice
增加 __str__()
方法
from django.db import models
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
再定义一个方法:
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)
(8)继续操作数据库表玩玩:
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
#按照字段查询
>>> Question.objects.filter(id=1)#查询id=1的数据
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
#查询字段有What开始的数据
<QuerySet [<Question: What's up?>]>
>>> from django.utils import timezone
>>> current_year = timezone.now().year #获取现在的年份
>>> Question.objects.get(pub_date__year=current_year)#查询年份为今年的数据
<Question: What's up?>
#获得id=2的数据(找不到,抛出异常)
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
#获得第一条数据
>>> Question.objects.get(pk=1)
<Question: What's up?>
#确保之前编写的方法可以执行
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# 查询以他的主键为外键的choice中的数据
>>> q.choice_set.all()
<QuerySet []>
# 以他为外键创建choice表数据
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
现在表长这样:
>>> c.question #访问外键实例(查看该选项的问题实例)
<Question: What's up?>
>>> q.choice_set.all()#查看以他为外键的choice实例(查看问题的答案实例)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()#查看以他为外键的实例个数(看问题有多少答案)
3
>>> Choice.objects.filter(question__pub_date__year=current_year)
#根据主键的字段进行条件 查询
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
#拿到答案以Just hacking开始的实例
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()#删!
这会的数据表: