Django实例(投票系统) -- 模型(model)

数据库配置

默认情况下,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命令
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容