数据库配置
默认情况下,Django配置的数据库时SQLite。如果想换一个自己比较熟悉的数据库,可以通过配置将数据库更换。在此,我将数据库改为了mysql的配置。
首先,打开mysite/settings.py文件,找到DATABASES的位置,修改为mysql的配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'USER': 'username',
'PASSWORD':'password',
'HOST': '127.0.0.1',
'PORT': '3306',
'NAME': 'mysite',
}
}
注意,如果你用除SQLite之外的数据库,需要确认你已经创建了数据库,比如这里需要事前创建‘mysite’数据库;另外,你在mysite/settings.py中配置的数据库用户拥有创建数据库的权限,因为在后面测试的时候,Django会自动去创建删除测试数据库,没有权限就没得玩了。
当然,在配置文件中还有很多配置,TIME_ZONE用于配置时区,INSTALLED_APPS用于配置应用,值得注意的是INSTALLED_APPS需要放在文件的开始,也就是说放在其他配置的前面。
创建模型
在我们简单的投票应用中,我们将创建两个模型:Question和Choice.Question包括两个字段,问题(question)和发布时间(publication date);Choice包含两个字段,选项内容(choice_text)和投票次数(vote)。每一个选项(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, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
关于模型的创建,每个模型是一个类,每个类有很多属性,这对应于一张表,一张表有很多属性。每个属性的类型都有相应的类型,是模块models中的相关类,比如,CharField()代表char类型,必须指定最大长度;DateTimeField()日期类型;IntegerField()整数类型。ForeignKey()代表外键关联。还有很多类型的用法需要我们去查文档学习。
生成数据库表
Django 1.7以及以上的版本,改变了数据库同步的命令。在此,首先生成数据库迁移策略,然后根据迁移策略对数据库进行创建和修改操作。主要执行以下的命令:
$ python manage.py makemigrations polls
//检查polls/models.py中的模型类是否发生改变,如果发生改变便生成新的迁移策略文件,保存在polls/migrations文件夹中,并将修改信息保存到数据库中
$ python manage.py migrate
//查看数据库中是否有新生成的迁移策略,如果有便执行。
$ python manage.py sqlmigrate polls 0001
//0001是迁移文件名,该命令返回它的SQL语句。
以上代码运行前两个就可以完成创建数据库表的操作,最后一句是为了让我们看到migrations命令到底生成了些什么。
在命令行下查看创建的对象模型
运行 python manage.py shell 进入django的命令行下,
>>> from polls.models import Question, Choice
>>> Question.objects.all()
<QuerySet []>
# 此时数据库中没有Question的数据
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# 创建Question对象,保存到数据库需要调用save()方法
>>> q.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()
# objects.all()显示数据库中的所有数据
>>> Question.objects.all()
<QuerySet [<Question: Question object>]>
运行到此处我们发现,<Question: Queston object>,对于这个对象我们并不知道这是哪个对象,没有任何的提示信息。我们想要根据某种方式来得到有效的提示信息。
打开polls/models.py文件,编辑:
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible # only if you need to support Python 2
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
@python_2_unicode_compatible # only if you need to support Python 2
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
_str()这个方法是比较关键的一个方法,重写这个方法不仅仅为了自己方便,在Django提供的admin管理时也会用到。@python_2_unicode_compatible这个装饰器用来兼容python2,如果python2的话,应该重写_unicode()方法。
通过重写_str_()方法就可以获得提示信息,这个方法类似于java中的toString()方法。
除了上面提到的save(),objects.all()这些方法外,模型类还有很多数据库操作相关的方法,比如:
- Question.objects.filter(id=1) -- 过滤id=1的所有结果,返回QuerySet结果集
- Question.objects.filter(question_text__startswith='What') -- 获取所有question_text以‘What’开头的结果集
- Question.objects.get(id=1) -- 获取id=1的结果,返回一个对象
- Question.objects.get(pk=1) -- 获取主键=1的结果,返回一个对象
可以看到,这里双下划线‘__’用于隔离查询条件的,因此不要将双下划线放在属性名中。
小结
创建或修改模型的步骤:
- 1.编写models.py
- 2.执行makemigrations和migrate命令