定义
用面向对象的方式去操作数据库的创建表以及增删改查等操作。
作用
用创建的类来实现对应slq的语句,ORM使得我们的通用数据库交互变得简单易行。
缺点:性能有所牺牲
字段
字段:在数据库中,大多数时,表的“列”称为“字段” ,每个字段包含某一专题的信息。就像“通讯录”数据库中,“姓名”、“联系电话”这些都是表中所有行共有的属性,所以把这些列称为“姓名”字段和“联系电话”字段。
CharField
#字符串字段, 用于较短的字符串.
IntegerField
#用于保存一个整数.
分类
一对一
一对多
多对多
创建单表
from django.db import models
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)
def __str__(self):
return self.name
创建关联表
#一对多(ForeignKey):
#方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个
# 字段设定对应值:
Book.objects.create(title='php',
publisher_id=2, #这里的2是指为该book对象绑定了Publisher表中id=2的行对象
publication_date='2017-7-7',
price=99)
#方式二:
# <1> 先获取要绑定的Publisher对象:
pub_obj=Publisher(name='河大出版社',address='保定',city='保定',
state_province='河北',country='China',website='http://www.hbu.com')
OR pub_obj=Publisher.objects.get(id=1)
# <2>将 publisher_id=2 改为 publisher=pub_obj
#多对多(ManyToManyField()):
author1=Author.objects.get(id=1)
author2=Author.objects.filter(name='alvin')[0]
book=Book.objects.get(id=1)
book.authors.add(author1,author2)
#等同于:
book.authors.add(*[author1,author2])
book.authors.remove(*[author1,author2])
#-------------------
book=models.Book.objects.filter(id__gt=1)
authors=models.Author.objects.filter(id=1)[0]
authors.book_set.add(*book)
authors.book_set.remove(*book)
#-------------------
book.authors.add(1)
book.authors.remove(1)
authors.book_set.add(1)
authors.book_set.remove(1)
#注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
# 如果第三张表是自己创建的:
class Book2Author(models.Model):
author=models.ForeignKey("Author")
Book= models.ForeignKey("Book")
# 那么就还有一种方式:
author_obj=models.Author.objects.filter(id=2)[0]
book_obj =models.Book.objects.filter(id=3)[0]
s=models.Book2Author.objects.create(author_id=1,Book_id=2)
s.save()
s=models.Book2Author(author=author_obj,Book_id=1)
s.save()
初始化数据库
记得在settings里的INSTALLED_APPS中加入’应用名称’,然后再同步数据库。
- python manage.py makemigrations
- python manage.py migrate
单表的增删改查
- 增(create , save)
from app01.models import *
#create方式一: Author.objects.create(name='Arthur')
#create方式二: Author.objects.create(**{"name":"Arthur"}) #插入
#save方式一: author=Author(name="Arthur")
author.save()
#save方式二: author=Author()
author.name="Arthur"
author.save()
- 删(delete)
book.objects.filter(id=1).delete()
- 改(update和save)
book.objects.filter(id=1).update() #推荐用
obj=models.Book.objects.filter(id=3)[0] #save方法会将所有属性重新设定一遍,效率低
obj.title="Python"
obj.save()
- 查
# <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
# <2>all(): 查询所有结果
# <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
_str_ 方法
不要打印内存地址,而打印内容