Django学习06---Model模型(数据库)

一、model基本介绍

  Django 模型是与数据库相关的, 与数据库相关的代码⼀般写在models.py 中, Django ⽀持 sqlite3, MySQL, PostgreSQL等数据库, 只需要在settings.py中配置即可, 不⽤更改models.py中的代码, 丰富的API极⼤的⽅便了使⽤。

二、model具体使用

1、工程创建以及目录显示

创建工程:
django-admin startproject douban

创建应用:
在douban工程项目目录下输入:

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

建立一个叫douban的app
这样,在你的工程项目douban目录下会出现一个叫books的目录
项目目录如下:
这里写图片描述

在douban目录settings.py中找到
INSTALLED_APPS
加入自己的app名称,比如’books’

2. 编写Model

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

name、address等是模型的字段。每个字段都被指定成一个类属性,每个属性映射到一个数据库的列。

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):
        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

上面的Publisher模型会在数据库中创建这样一张表:

CREATE TABLE books_publisher(
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL,
    "address" varchar(30) NOT NULL,
    "city" varchar(30) NOT NULL,
    "state_province" varchar(30) NOT NULL,
    "country" varchar(30) NOT NULL,
    "website" varchar(30) NOT NULL,
);

* 一些技术上的注意事项: *

  • 这个表的名称books_publisher,是根据模型中的元数据自动生成的,也可以重写为别的名称。

  • id 字段是自动添加的,但这个行为可以被重写。详见自增主键字段。

  • 这个例子中的CREATE TABLE SQL 语句使用PostgreSQL 语法格式,要注意的是Django 会根据设置文件 中指定的数据库类型来使用相应的SQL 语句

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

  • django会自动给每个model配置一个名为id的primary key

3. 同步数据库(create table):

在shell中输入
python manage.py makemigrations
此操作建立了模型到表的映射关系
这里写图片描述

python manage.py migrate
此操作生成表
之后你应该能看到诸如:
这里写图片描述

三. model具体操作

1、(插入一个新的对象) insert:

如果是在ubuntu中或者linux直接输入命令行,如果是在pycharm中直接Terminal中输入如下命令行则ok
from books.models import Author

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

2. 额外问题:为model加入字符串表现形式

在每个model里加入:
def unicode(self):
return self.name
return 处写上你想要的字符串

3. (查询或选择对象)select:

3.1 获取一个记录对象:
Author.objects.get(name="zhangsan")
--select * from books_author where name='zhangsan'
注意:get返回的对象具有唯一性质,如果符合条件的对象有多个,则get报错!
3.2 获取所有记录对象:
Author.objects.all()
-- select * from books_author
3.3 获取满足某些条件的记录对象
名字完全等于zhangsan:
Author.objects.filter(name='zhangsan')
Author.objects.filter(name__exact='zhangsan')
——相当于 select from books_author where name = 'zhangsan'

名字对zhangsan大小写不敏感:
Author.objects.filter(name__iexact='zhangsan')
——相当于 select from books_author where upper(name)='ZHANGSAN'

名字包含zhang:
Author.objects.filter(name__contains="zhang")
——相当于 select from ... where name LIKE '%zhang%';

查询条件使用正则:

区分大小写的正则:
Author.objects.filter(name__regex='^zhang')
不区分大小写的正则:
Author.objects.filter(name__iregex='^zhang')

以上方法,返回的都是一个list (其实是query set
3.4 获取排除某些条件的记录对象
排除name等于zhangsan的记录:
Author.objects.exclude(name ="zhangsan")

排除name中包含zhang的记录:
Author.objects.exclude(name__contains="zhang")

以上filter和exclude也可以组合使用:
获取姓zhang但是不叫zhangsan的:
Author.objects.filter(name__iregex='^zhang').exclude(name__contains='san')
3.5. (对结果排序) order:
Author.objects.order_by("name")
——相当于 select from ...  ORDER BY name;

多项排序:
Author.objects.order_by("age", "name")

逆向排序:
Author.objects.order_by("-name")

连锁查询:
Author.objects.filter(age=30).order_by("-name")

4. (更新对象)update:

1)使用save()方法:
p = Author.objects.get(name='Zhangsan')
p.name = 'zhangsan'
p.save()
——相当于
UPDATE books_Author SET
    name = 'zhangsan',
    age = 30,
        email = 'zhangsan@126.com'
WHERE name='Zhangsan';

所有的列都被更新了!效率低!
2)用update() 方法才比较好:
Author.objects.filter(name='Zhangsan').update(name='zhangsan')
——相当于
UPDATE books_Author
SET name = 'zhangsan'
WHERE name='Zhangsan';  

可以对多行同时进行更新:
Author.objects.all().update(country='USA')
update()方法会返回一个整型数值,表示受影响的记录条数

5. (删除对象)delete:

调用该对象的delete()方法即可:
p = Author.objects.get(name="O'Reilly")
p.delete()
一旦使用all()方法,所有数据将会被删除:
Author.objects.all().delete()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值