Django学习(三) Django模型创建以及操作
在Django中可以建立自己的模型Model,这里对应Java里的实体类,跟数据库表是对应的。其中用到了django.db模块中的models。如下图所示:
mysite/news/models.py
from django.db import models class Reporter(models.Model):
full_name = models.CharField(max_length=70) def __str__(self): # __unicode__ on Python 2
return self.full_name class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter) def __str__(self): # __unicode__ on Python 2
return self.headline
这里建立了两个类,一个是Reporter,一个是Article。每个类都还定义了一个函数(Python中的函数相当于Java或者JavaScript中的方法,Python用关键字def对函数进行定义,JavaScript用function定义而已) "__str__" ,注意这里函数名字,是前后各有两个下划线,其作用就是返回这个类的字符串描述,可以理解成相当于java中的toString方法。
Reporter有一个字段交full_name,类型是CharField(最大长度是70),这里我理解就是告诉程序他是一个字符串类型的数据,最大长度是70,方便根据此映射数据库。
Article中定义了pub_date,他是一个时间类型的数据,headline是一个字符串类型的数据,content是一个text类型的数据,这里还给Article定义了一个外键ForeignKey为Reporter,这样在用程序自动生成数据库表的时候就会自动建立外键关联了。
以上为Python对实体类的定义。然后通过执行Python命令就可以轻松创建数据库表了。
自动创建数据库表的Python命令是:Python manage.py migrate 。其中migrate是迁移的意思,可以理解成将Python类迁移、映射到数据库中,Python会自动给表加上主键,名称是id。
一旦建立了表,那么Python就可以通过Python中定义的类操作这些数据库中的表数据了。如下:
# 导入刚才新建模块中的类Reporter和Article
>>> from news.models import Reporter, Article # 查询所有的Reporter,显示为空
>>> Reporter.objects.all()
[] # 建立一个新的Reporter,全称叫John Smith
>>> r = Reporter(full_name='John Smith') # 保存这个对象到数据库,只需要调用save函数即可。
>>> r.save() # 通过.id即可以获取到刚才保存的Reporter数据的id
>>> r.id
1 #再次查询数据库中的Reporter,则刚才新插入的Reporter会显示出来,可以看出来这里显示的内容即是在类里面__str__定义返回的内容
>>> Reporter.objects.all()
[<Reporter: John Smith>] # 通过.属性名称既可以获取属性名
>>> r.full_name
'John Smith' # django还提供了丰富的API来查询过滤数据,
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
#查询full_name以'John'开头的数据
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
#传full_name中包含'mith'的数据
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
#如果查询不到数据,则会报查询不到的异常。这个应该是可以通过设定来防止报错的?
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Reporter matching query does not exist. # 建立一个新的Article
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
... content='Yeah.', reporter=r)
>>> a.save() # Now the article is in the database.
>>> Article.objects.all()
[<Article: Django is cool>] # Article对象可以通过api获取其关联的Reporter对象的数据
>>> r = a.reporter
>>> r.full_name
'John Smith' # 反之亦然,通过Reporter对象可以获取所有的Article对象,通过对象.关联对象_set.all()获取
>>> r.article_set.all()
[<Article: Django is cool>] # The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
# Article还可以通过过滤其所属Reporter的相关信息来查询自己,如下通过reporter__reporter中的属性__startswith='John'
# 确实好强大
>>> Article.objects.filter(reporter__full_name__startswith='John')
[<Article: Django is cool>] # Change an object by altering its attributes and calling save().
# 改变Reporter中full_name的值
>>> r.full_name = 'Billy Goat'
>>> r.save() # Delete an object with delete().
# 删除Reporter
>>> r.delete()
Django学习(三) Django模型创建以及操作的更多相关文章
- Django学习手册 - ORM 数据创建/表操作 汇总
ORM 查询的数据类型: QuerySet与惰性机制(可以看作是一个列表) 所谓惰性机制:表名.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它 ...
- Django学习之django自带的contentType表 GenericRelation GenericForeignKey
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...
- day 94 Django学习之django自带的contentType表
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...
- day 93 Django学习之django自带的contentType表
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...
- day 91 Django学习之django自带的contentType表
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net ...
- Django学习之django自带的contentType表
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/aar ...
- Django(三) 模型:ORM框架、定义模型类并创建一个对应的数据库、配置Mysql数据库
一.模型概述 https://docs.djangoproject.com/zh-hans/3.0/intro/tutorial02/ https://www.runoob.com/django/dj ...
- Django 学习笔记之模型高级用法
目录 1 复杂的字段类型 1.1 整数类型的区别 1.2 自增类型的区别 1.3 时间类型 1.4 FilePathField 1.5 FileField 1.6 ImageField 2 关系字段 ...
- django学习-10.django连接mysql数据库和创建数据表
1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...
随机推荐
- winform 读取保存配置文件
原文连接: public static string fileName = System.IO.Path.GetFileName(Application.ExecutablePath); ...
- QObject就有eventFilter,功能很强(随心所欲的进行处理,比如用来QLineEdit分词)
相信大家都用过词典吧!因为英语不太好...O(∩_∩)O~,所以经常进行划词翻译! 简述 实现 效果 源码 更多参考 实现 原理:鼠标移至某单词之上,获取鼠标位置,然后在对应位置进行取词,翻译! 基于 ...
- 在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0
//在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0//如果某字符串, 直接传入字符串进来//如果要查找16进制,则用如下格式传参进来: #$1A#$2A#$3A function F ...
- JDBC的使用——Statement
JDBC是Java最基本的数据库操作途径,虽然现在有了更高端的Hibernate和JPA,但是其实它们的底层还是用的这些最基本的JDBC.而且,如果开发一个小型的应用程序,使用Hibernate不免有 ...
- 【转】Linux驱动模块编译进内核中
原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一. 驱动程序编译进内核的步骤 在 l ...
- C语言随笔_return答疑
1. 例子,看实例2-2.这道题有同学会问,那个return有什么用?这么讲吧,return是个英文单词,中文意思是“返回”,用在程序里也是返回的意思,返回啥呢?返回一个值.在func函数中,retu ...
- LeeCode-Pow(x, n)
Implement pow(x, n). double myPow(double x, int n) { ) return 1.0; ) return 1.0/pow(x,-n); ); }
- LeeCode-Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 /** * Definition for a ...
- Android.mk文件语法规范及使用模板
Android.mk文件语法详述 介绍:------------这篇文档是用来描述你的C或C++源文件中Android.mk编译文件的语法的,为了理解她们我们需要您先看完docs/OVERVIEW.h ...
- $.cookie is not a function
在调试网站的时候,用jquery获取cookie时,报错: $.cookie is not a function; 一般情况$.cookie is not a function;错误原因: 一.没有引 ...