云服务器

完美主义者的最终框架

2019-12-05 16:20:41 29
Django模型是与数据库相关的,与数据库相关的代码一般写在 models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。


Model相对于传统的三层或者mvc框架来说就相当于数据处理层,它主要负责与数据的交互,在使用django框架设计应用系统时,需要注意的是django默认采用的是orm框架中的codefirst模型,也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来


django会根据Model类生成一个数据库镜像文件,然后再使用该镜像文件生成数据库,同时该文件将记录与数据库同步版本的变化,所以在使用django进行开发时不要手工去修改数据库,这样会造成django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容。Django中引用了ORM(Objects Relational Mapping)对象关系映射,对不同的数据库都提供了同一调用的API。ORM是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。可以简单理解为翻译机。


下面通过简单的代码来看看model是怎么创建数据库的。


创建工程和APP

创建工程:

django-admin startproject douban

 

创建应用:

douban工程项目目录下输入:


python manage.py startapp book(你想建立的app名称)


建立一个叫bookapp

这样,在你的工程项目douban目录下会出现一个叫book的目录

 

将我们新建的应用(book)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。

INSTALLED_APPS = (   'django.contrib.admin',   'django.contrib.auth',   'django.contrib.contenttypes',   'django.contrib.sessions',   'django.contrib.messages',   'django.contrib.staticfiles',    'book',)
创建Model


book目录下进入models.py输入类似下面的代码:

class  Publisher(models.Model):    name  = models.CharField(max_length=30)    address  = models.CharField(max_length=50)    city  = models.CharField(max_length=60)    state_province  = models.CharField(max_length=30)    country  = models.CharField(max_length=50)    website  = models.URLField()        def __unicode__(self):  #python3 def__str__(self)            return self.name  class  Author(models.Model):    name  = models.CharField(max_length=30)        age = models.IntegerField()    email  = models.EmailField()        def __unicode__(self):            return self.name  class  Book(models.Model):    title  = models.CharField(max_length=100)    authors  = models.ManyToManyField(Author)    publisher  = models.ForeignKey(Publisher)    publication_date  = models.DateField()        def __unicode__(self):            return self.title

 

上面的每个class相当于一个新的table

django会自动给每个model配置一个名为idprimary key

 

同步数据库


shell中输入

python manage.py makemigrations       #建立了模型到表的映射关系

python manage.py migrate                        #生成表

 

之后你应该能看到诸如:

Creating tables...

Creating tablebooks_publisher

Creating tablebooks_author

Creating tablebooks_book_authors

Creating tablebooks_book

Installingcustom SQL ...

Installingindexes ...

Installed 0object(s) from 0 fixture(s)

这样的信息

 

使用Navicat可以直观看到生成的表


 


数据库的增删改查


(插入一个新的对象) insert

python-shell下面操作可以直接操作

from book.modelsimport AuthorØ  方法1:p1 =Author(name='zhangsan',age=30,email='zhangsan@126.com')p1.save()Ø  方法2:p1 = Author()p1. name='zhangsan'p1.age =30p1.email='zhangsan@126.com'p1.save()Ø  方法3:Author.objects.create(name='zhangsan',age=30,email='zhangsan@126.com')Ø  方法4:Author.objects.get_or_create(name='zhangsan',age=30,email='zhangsan@126.com)第4种方法是防止重复很好的方法, 但是速度要相对慢些, 返回一个元组, 第一个为Author对象, 第二个为True或False,新建时返回的是True, 已经存在时返回False.

(查询或选择对象)select

python-shell下面操作可以直接操作

n  获取一个记录对象:Author.objects.get(name="zhangsan")注意:get返回的对象具有唯一性质,如果符合条件的对象有多个,则get报错!n  获取所有记录对象:Author.objects.all()n  获取满足某些条件的记录对象1)名字完全等于zhangsan:Author.objects.filter(name='zhangsan')Author.objects.filter(name__exact='zhangsan')2)名字对zhangsan大小写不敏感:Author.objects.filter(name__iexact='zhangsan')3)名字包含zhang:Author.objects.filter(name__contains="zhang")

(更新对象)update

python-shell下面操作可以直接操作

from book.modelsimport Author l   使用save()方法:p =Author.objects.get(name='Zhangsan')p.name = 'zhangsan'p.save()所有的列都被更新了!效率低! l   用update()方法才比较好:Author.objects.filter(name='Zhangsan').update(name='zhangsan') l   可以对多行同时进行更新:Author.objects.all().update(country='USA')update()方法会返回一个整型数值,表示受影响的记录条数

(删除对象)delete

python-shell下面操作可以直接操作

from book.modelsimport Author u  调用该对象的delete()方法即可:p = Author.objects.get(name="O'Reilly")p.delete()u  使用all()方法,所有数据将会被删除:Author.objects.all().delete()



睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032

上一篇: 无

微信关注

获取更多技术咨询