ORM常识:
1、一对多,多的一方设置外键字段,有外键字段的表叫做子表。没有外键字段的表叫做主表。
2、主表放到子表的下面,否则子表找不到主表,写数据要先往主表中写。
数据库:(1)不创建主键,会自动添加主键。
(2)创建的外键会自动添加后缀“_id”
练习题:
1、一对多、一对一
创建一个book表,有title和price字段
创建一个publish表,有name和addr字段
建立book和publish之间一对多的关系
用save和create的方法给publish表添加两条数据。
给book表添加两条数据:金瓶眉、23、出版社2;水浒传、34、出版社2 。 ||| (有save方法和create方法/知识点:一对多创建数据)
1、找到出版“金瓶眉”的出版社所在的地址(一对多查询)
2、多对多
创建一张author表,字段有name。
给book表和author表添加多对多的关系。(ManyToManyField)
给author添加两个作者:egon和alex (准备工作、用save和create两种方式完成)
给book表和author表添加关联,id=2的书同时由egon和alex两个人写。(创建数据多对多)
2-1
取消book表和author表两张表之间的关联。
参考:
book_obj.authors.clear() #直接清空绑定的关系
autho=Author.objects.get(name='alex') 找到名字叫做'alex'的作者对象
book_obj.authors.remove(autho) #删除指定的作者对象。
book_obj.delete()
2-2
给水壶传绑定所有的作者。
参考:
def add(request):
author_list=Author.objects.all() #给一本书绑定所有的作者
book_obj.authors.add(*author_list) #一本书绑定所有的作者,
3、级联删除
将金瓶眉删除和它相关联的数据也删除(级联删除)
参考:
Book_obj=Book.objects.get(id=3)
Book_obj.delete() #找到一本书的对象,然后.delete() 就可以把这本书和它对应的关系删除。
1、连接Mysql数据库
l Settings中的代码:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books', #你的数据库名称
'USER': 'root', #你的数据库用户名
'PASSWORD': '', #你的数据库密码
'HOST': '', #你的数据库主机,留空默认为localhost
'PORT': '3306', #你的数据库端口
}
}
l __init__.py中的代码:
import pymysql
pymysql.install_as_MySQLdb() ##settings.py同一个目录的__init__.py
3、建表 day67
l Urls.py中的代码:
from app01 import views
url(r'^add/', views.add),
l Models.py
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
def __str__(self):
return self.name+" "+self.addr
# Book 与 Publish是一对多的关系 :models.ForeignKey(Publish)
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2)
#创建外键一对多的关系
publish=models.ForeignKey(Publish)#添加外键,括号中指定表名后,会自动识别publish表中的主键。
def __str__(self):
return self.title
2、单表添加数据
l # 添加记录两种方式:
# create 方式
Publish.objects.create(
name="老衲出版社",
addr="沙河"
)
# save方式
p=Publish(name="瞎驴出版社",addr="昌平区")
p.save()
l 查询API:
表.objects.all() 得到是QuerySet集合对象------ [obj1,obj2,]
表.objects.filter(id=2) 得到是QuerySet集合对象-------[obj1,]
表.objects.get(id=2) 得到是一个Model对象 obj 有且只能有一条匹配的结果,否则报错。
3、添加一对多数据 day67
l views.py
方法1
#在执行下面的代码之前,先在publish表里面插入两条数据
# 一对多 添加一个book记录 方法1:
def add(request):
Book.objects.create(
title="python",
price=100.00,
publish_id=2
)
return HttpResponse("ok")
def add(request):
book_obj=Book.objects.get(id=1)
print(book_obj.title)
print(book_obj.price)
print(book_obj.publish) 打印id等于1的外键对象。在model.py中写了__str__,所以会打印对象的属性。
方法2
# 一对多,添加一个book记录
publish_obj=Publish.objects.get(id=1) # 一个publish对象
# 创建一个Book对象
Book.objects.create(
title="Linux",
price=29.00,
publish=publish_obj #可以为外键字段指定一个对象作为外键
)
###########################################################3
save 方法
# 一对多 save 方法
b=Book(title="",price="",publish=pub_obj)
b.save()
b = Book(title="", price="", publish_id=1)
b.save()
Python manage.py makemigrations #生成数据库脚本
Python manage.py migrate #同步数据库
Python manage.py runserver 8800 #启动项目
多对多的关系day67
l Models.py中的代码
# Book 与 Publish是一对多的关系
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
def __str__(self):
return self.name+" "+self.addr
class Book(models.Model):
title=models.CharField(max_length=32)
price=models.DecimalField(max_digits=6,decimal_places=2)
publish=models.ForeignKey(Publish) #创建外键一对多的关系
authors=models.ManyToManyField("Author") # 创建外键多对多的关系。加上引号Author这张表即使在下面也可以找到
def __str__(self):
return self.title
class Author(models.Model):
name=models.CharField(max_length=32)
def __str__(self):
return self.name #打印queryset集合元素的name
# 添加多对多关系
# +++++++++++++++++++通过对象绑定关系
def add(request):
book_obj=Book.objects.get(id=3) #找到id=3的书的对象
print("authors: ",book_obj.authors.all()) # 找到id=3的这本书所有关联的作者对象集合 [author1,author2,]
# 绑定关系
author_obj1=Author.objects.get(id=1) #获取作者对象
author_obj2=Author.objects.get(id=2) #获取作者对象
book_obj.authors.add(author_obj1,author_obj2) #给book和author绑定关系
return HttpResponse("OK")
#第二种情况
def add(request):
author_list=Author.objects.all() #给一本书绑定所有的作者
book_obj.authors.add(*author_list) #一本书绑定所有的作者,
*列表名:传实参 如果传列表就加* ; 如果传字典就加:**。
手动添加多对多关系表
################自己创建第三张表
Models.py中的代码
class Book2Author(models.Model):
book=models.ForeignKey("Book")
author=models.ForeignKey("Author")
views.py文件中的代码
# 向手动创建的第三张表中添加记录
b2a=Book2Author(book_id=4,author_id=3)
b2a.save()
解除多对多绑定
book_obj.authors.clear() #直接清空绑定的关系
autho=Author.objects.get(name='alex') 找到名字叫做'alex'的作者对象
book_obj.authors.remove(autho) #删除指定的作者对象。
book_obj.delete()
级联删除:day67-06-00:13:30
Book_obj=Book.objects.get(id=3)
Book_obj.delete() #找到一本书的对象,然后.delete() 就可以把这本书和它对应的关系删除。