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:
- Django学习系列(三)——编写第一个Django应用part2_模型
- Django学习系列(二)——编写第一个Django应用part1_项目与应用
- Django学习系列(五)——编写第一个Django应用part4_View&URL
- Django学习系列(六)——编写第一个Django应用part5_Template
- Django学习系列(四)——编写第一个应用part3_Admin
- Django教程之三-----编写你的第一个Django 应用(1)
- Django tutorial(2)【翻译】编写第一个Django app,第二部分——创建模型和使用模型
- Django tutorial(3) 【翻译】编写第一个Django app,第三部分——玩转模型层的API
- Django tutorial(1)【翻译】编写第一个Django app,第一部分——创建项目
- Django系列——第一个Template
- 编写第一个Django应用:第二部分
- 编写你的第一个Django应用
- Django 1.10中文文档—第一个Django应用Part1
- 初始django笔记之编写第一个django应用
- Django学习——开发你的第一个Django应用1
- Django学习——开发你的第一个Django应用2
- Django学习笔记2-编写第一个Django程序
- django编写第一个博客学习笔记(一)
- JavaScript 想要转换数字的基数咋办?
- ECmall邀请注册功能构想和实现
- 23种设计模式之二十三(行为模式)Interpreter模式
- jboss中调用webservice时报java.lang.RuntimeException: Cannot create a secure XMLInputFactory的异常
- Linux环境下Redis的安装与配置
- Django学习系列(三)——编写第一个Django应用part2_模型
- 【Python】发送带文字图片附件的邮件
- Java网络爬虫的实现
- 2015-2-9-工作日志-刘婉
- Java多线程——执行器(Executor)
- java5条件阻塞Condition的应用(十三)
- 什么是java序列化,如何实现java序列化?
- 小马哥----高仿华为荣耀3c刷机 主板S67主板 详细拆机主板图鉴别。
- 2015.02.09——张佳莉