Django学习系列(三)——编写第一个Django应用part2_模型

来源:互联网 发布:不能用数据上网 编辑:程序博客网 时间:2024/05/22 10:25

    模型是所有数据的唯一并且最终的数据源,包含所存储的数据中的一些必要的字段和行为。

    Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中。每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。属性名就是字段名,它的类型相当于数据库字段描述。

    在本例中,将创建两个模型:Question(议题)和Choice(选项)。Question模型有两个字段:议题的内容和议题的发布时间。Choice模型也有两个字段:选项的内容和选项的得票结果。每一个Choice都关联了一个Question。

    编辑polls/models.py

from django.db import models# Create your models here.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)    choice_text = models.CharField(max_length = 200)    votes = models.IntegerField(default = 0)

每个模型在代码上都被用一个类来实现。

每个Django Model都继承自django.db.models.Model,在Model当中每一个属性attribute都代表一个database field。通过Django Model API可以执行数据库的增删改查,而不需要写一些数据库的查询语句。

CharField:用于存储字符串,max_length设置最大长度(这个参数不近会在构建数据库表结构时起作用,在数据验证中也会起到一定作用)

DateTimeField:用于存储时间,

ForeignKey:定义了一个关联,每一个Choice都关联了一个Question。

TextField:用于存出大量文本


有了这些模型代码,Django就能够为这个应用创建数据表结构,为Question对象和Choice对象创建一组用于访问数据库的Python API。

运行makemigrations命令,告知Django,模型已经有个更改,并且愿意将这些更改存储为迁移文件。Django通过迁移文件来保存对模型的改动。


可以从polls/migrations/0001_initial.py查看迁移语句。 

运行python manage.py sqlmigrate polls 0001来查看迁移的sql语句 


运行migrate命令,在数据库中创建模型所对应的数据表。


migrate命令会找出还没有被应用的迁移文件,并且运行它们来更新数据库,即将数据库与改动后的模型同步。

创建了模型之后,可以通过Django提供的API来做测试。


objects.all()会显示数据库中所有Question对象的值。开始系统中还没有Question议题,所以获取对象为空。

在默认的配置文件中,时区支持是被激活的。所以Django是通过tzinfo来为pub_date预测日期和时间的。在Django 中,可以使用自带的timezone.now()而不是datetime.datetime.now()来获得日期和时间,它也能获得正确的答案。

将对象保存到数据库中,显示的调用save()。

新建一个对象的方法:

       1     Question.objects.create((question_text="What'up?"pub_date=timezone.now())  

        2     q = Question(question_text="What'up?"pub_date=timezone.now())  

                q.save()

        3      Question.objects.get_or_create()

获取对象的方法:

        1      Question.objects.all()

        2      Question.objects.all()[:10]切片操作,可以节约内存

        3      Question.objects.get(question_text=question_text)   

        get用来获取一个对象,如果需要获取满足条件的对象,就要用到filter

        4       Question.objects.filter(question_text="what")     question_text严格等于“what”

        5       Question.objects.filter(question_text__iexact="what")     question_text为 what,但是不区分大小写

        6       Question.objects.filter(question_text__contains="what")     question_text包含 what

        7       Question.objects.filter(question_text__icontains="what")     question_text包含 what,但不区分大小写

        8       Question.objects.filter(question_text__regex="^what")     正则表达式查询

        9       Question.objects.filter(question_text__iregex="^what")     正则表达式不区分大小写

       排除某些条件的:

       10      Question.objects.exclude(question_text__containst="what")     排除包含what的对象

       11      Question.objects.filter(question_text__contains="what").exclude()     找出满足what 排除exlude中条件的对象

打印所有的Question时,输出的结果是[<Question: Question object>]这没啥意义。

编辑polls.models.py

from django.db import models# Create your models here.class Question(models.Model):    question_text = models.CharField(max_length = 200)    pub_date = models.DateTimeField('date published')    def __unicode__(self):                     return self.question_textclass Choice(models.Model):    question = models.ForeignKey(Question)    choice_text = models.CharField(max_length = 200)    votes = models.IntegerField(default = 0)    def __unicode__(self):                     return self.choice_text

保存改动,再次进入命令行:


添加一个自定义方法:

from django.db import modelsimport datetimefrom django.utils import timezone# Create your models here.class Question(models.Model):    question_text = models.CharField(max_length = 200)    pub_date = models.DateTimeField('date published')    def __unicode__(self):                     return self.question_text    def was_published_recently(self):        return self.pub_date >= timezone.now()-datetime.timedelta(days=1)class Choice(models.Model):    question = models.ForeignKey(Question)    choice_text = models.CharField(max_length = 200)    votes = models.IntegerField(default = 0)    def __unicode__(self):                     return self.choice_text


再次运行python manage.py shell:


0 0