python投票系统项目ppt_Django实例(投票系统) -- 模型(model)

本文介绍了如何在Django中配置数据库为MySQL,包括修改settings.py文件和创建数据库迁移。接着,详细讲解了如何创建Question和Choice模型,以及如何使用Django的shell进行交互式操作。文章还强调了_str_方法的重要性,用于提供对象的字符串表示,并列举了一些常用的数据库查询方法。
摘要由CSDN通过智能技术生成

数据库配置

默认情况下,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()

# 此时数据库中没有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=)

>>> q.question_text = "What's up?"

>>> q.save()

# objects.all()显示数据库中的所有数据

>>> Question.objects.all()

]>

运行到此处我们发现,,对于这个对象我们并不知道这是哪个对象,没有任何的提示信息。我们想要根据某种方式来得到有效的提示信息。

打开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命令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值