Django(六)模型与数据库

    Django对各种数据库提供了很好的支持,而且为很多数据库提供了统一的调用API,这些API统称为ORM框架。通过使用Django内置的ORM降价可以实现数据库操作。ORM框架是一种程序技术,用于实现面向对象编程语言中不同类型系统的数据之间的转换。从效果上说,其实是创建了一个可在编程语言中 使用的“虚拟对象数据库”,通过对虚拟对象数据库操作从而实现对膜表数据库的操作。两者是相互对象,虚拟对象数据库也称模型。

构建模型

    具体实现操作过程:

    1.配置目标书库信息,主要在settings.py设置数据库信息,具体操作查看:配置信息

    2.构建虚拟对象数据库,在APP的models.py文件中一类的形式定义模型。

    3.通过模型在目标数据库中创建相应的数据表。

    4.在视图函数中通过对模型操作实现目标数据库的读写操作。


在项目index的models.py文件中定义模型,代码如下:

from django.db import models

# Create your models here.

# 创建产品分类表

class Type(models.Model):

    id = models.AutoField(primary_key=True)

    type_name = models.CharField(max_length=20)

# 创建产品信息表

lass Product(models.Model):

    id = models.AutoField(primary_key=True)

    name = models.CharField(max_length=50)

    weight = models.CharField(max_length=20)

    size = models.CharField(max_length=20)

    type = models.ForeignKey(Type, on_delete=models.CASCADE)

上述代码分别定义了模型Type和Product:

    1.模型以类的形式进行定义,并且继承Django的models.Model类,一个类代表目标数据库的一张表。

    2.模型的字段以类属性进行定义,如id = models.IntegerField(primary_key=True)代表在数据表Type中命名一个名为id的字段,该字段的数据类型为整型并设置为主键。

完成模型的定义后,接着在目标书库中穿件相应的数据表,在目标数据库中的创建表是通过Django的管理工具manage.py完成。创建数据表需要执行两次指令,分别是:

E:\Mydjango> python manage.py makemigrations

E:\Mydjango> python manage.py  migrate

makemigrations指令用于将index所定义的模型生成0001initial.py文件,改文件存放在index的migrations文件夹。0001_initial.py文件将models.py的内容生成数据表的脚本代码,migrate指令是根据脚本代码在目标数据库中生成相对应的书库表。


数据库表关系

    一个模型对应目标数据库的一个数据表,每个数据表之间是可以存在关联。表与表之间有三种关系:一对一,一对多,多对多。

# # 一对多关系#

class Performer(models.Model):

    id = models.IntegerField(primary_key=True)

    name = models.CharField(max_length=20)

    nationality = models.CharField(max_length=20)

class Program(models.Model):

    id = models.IntegerField(primary_key=True)

    performer = models.ForeignKey(Performer,on_delete=models.CASCADE)

    name = models.CharField(max_length=20)

# 一对多关系

class Performer(models.Model):

    id = models.IntegerField(primary_key=True)

    name = models.CharField(max_length=20)

    nationality = models.CharField(max_length=20)

class Program(models.Model):

    id = models.IntegerField(primary_key=True)

    performer = models.ForeignKey(Performer,on_delete=models.CASCADE)

    name = models.CharField(max_length=20)

# 多对多关系

class Performer(models.Model):

    id = models.IntegerField(primary_key=True)

    name = models.CharField(max_length=20)

    nationality = models.CharField(max_length=20)

class Program(models.Model):

    id = models.IntegerField(primary_key=True)

    name = models.CharField(max_length=20)

    performer = models.ManyToManyField(Performer)


数据库读写操作

    数据的插入一般有两种方式:

    # 方法一

>>> Product.objects.create(name='p30', weight='120g', size='120*75*8mm',type_id=1)

# 方法二

>>> Product(name='p30', weight='120g', size='120*75*8mm',type_id=1) .save()

    数据的更新操作:

# 更新多条数据,查询条件filter以列表格式返回,查询结果可能是一条或多条数据

Product.objects.filter(name='p30').update(name='p40')

# 全表更新,不适用查询条件,默认对全表的数据进行更新

Product.objects.update(name='p50')

    数据的删除三种操作:

# 删除表中全部数据

Product.objects.all().delete()

# 删除一条数据

Product.objects.get(id=5).delete()

#删除多条数据

Product.objects. filter(name='p30').delete()

    查询条件get和filter的区别如下:

1.查询条件get:查询字段必须是主键或者唯一约束的字段,并且查询的数据必须存在,否则程序会抛出异常。

2.查询条件filter:查询字段没有限制,只要改字段是数据表的某一字段即可。查询结果以列表的形式返回。查询不到结果就返回空列表。


    数据查询是数据库操作中最负责并且内容最多的部分,Django是如何通过ORM框架提供API实现数据查询的,代码如下:

>>> from index.models import *

# 全表查询

>>> p = Product.objects.all()

>>> p[1].name

"HUAWEI nova 2s"

# 查询前5条数据,SQL语句里面的limit方法在Django中使用Python的列表截去分解即可实现

>>> p = Product.objects.all()[:5]

# 查询某个字段,使用values方法,以列表形式返回数据,列表元素以字典格式表示

>>> p = Product.objects.values('name')

>>> p[1]['name']

"HUAWEI nova 2s"

# values_lists 方法以列表表示返回数据,列表元素以元组格式表示

>>> p = Product.objects.values_list('name')[:3]

>>> p

<QuerySet  [('荣耀V10',), (' HUAWEI nova 2s ',), ('P30',)]>

# 使用get方法查询数据

>>> p = Product.objects.get(id=5)

>>> p.name

"HUAWEI nova 2s"

# and 查询,使用filter方法查询数据,注意区分get和filter的差异

>>> p = Product.objects. filter(name='P30', id=8)

>>> p

<QuerySet  [<Product: Product object (9) >]>

# SQL的or查询,需要引入Q,编写格式: Q(field=value) | Q (field=value)

>>> from django.db.models import Q

>>> p = Product.objects.filter(Q(name='P30')|Q(id=8))

# 使用count方法统计查询数据

>>> p = Product.objects.filter(name='P30').count()

# 去重查询,distinct方法

>>> p = Product.objects.values('name').filter(name='P30').distinct()

# 降序排序,只需要在order_by里面的字段前面加-即可

>>> p = Product.objects. order_by('-id')



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

推荐阅读更多精彩内容