ORM(一)

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数据库

Settings中的代码:

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'books',   #你的数据库名称

        'USER': 'root',        #你的数据库用户名

        'PASSWORD': '',       #你的数据库密码

        'HOST': '',                  #你的数据库主机,留空默认为localhost

        'PORT': '3306',         #你的数据库端口

    }

}

__init__.py中的代码:
import pymysql
pymysql.install_as_MySQLdb()          ##settings.py同一个目录的__init__.py

 

3、建表 day67

Urls.py中的代码:

from  app01 import views
url(r'^add/', views.add),

 

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、单表添加数据

# 添加记录两种方式:
# create 方式
Publish.objects.create(
    name="老衲出版社",
    addr="沙河"
)

# save方式
p=Publish(name="瞎驴出版社",addr="昌平区")
p.save()

 

查询API:

     表.objects.all()         得到是QuerySet集合对象------ [obj1,obj2,]

     表.objects.filter(id=2)  得到是QuerySet集合对象-------[obj1,]

     表.objects.get(id=2)     得到是一个Model对象   obj            有且只能有一条匹配的结果,否则报错。

3、添加一对多数据 day67

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

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() 就可以把这本书和它对应的关系删除。

posted @ 2017-09-21 20:22  linuxws  阅读(266)  评论(0编辑  收藏  举报