1. 程式人生 > >Django多變關聯、增加數據、刪除數據

Django多變關聯、增加數據、刪除數據

filter obj __str__ pre import 對象 har 一對一 integer

建立表之間的關聯關系:

models.py裏面對表的字段及外鍵關系的設置如下:

from django.db import models

# Create your models here.

#出版社表
class Publish(models.Model):
    nid=models.AutoField(primary_key=True)
    name=models.CharField(max_length=32)
    addr=models.CharField(max_length=64)
    email=models.EmailField()

    def __str__
(self): return self.name #作者表(與AuthorDetail是一對一關系) class Author(models.Model): nid=models.AutoField(primary_key=True) name=models.CharField(max_length=32) age=models.IntegerField() #建立與AuthorDetail一對一關系 authordetail=models.OneToOneField(to=AuthorDetail,to_field=nid)
def __str__(self): return self.name #作者詳細信息表 class AuthorDetail(models.Model): nid=models.AutoField(primary_key=True) phone=models.CharField(max_length=32) email=models.EmailField() def __str__(self): return self.phone #書籍表 class Book(models.Model): nid=models.AutoField(primary_key=True) name
=models.CharField(max_length=32) price=models.DecimalField(max_digits=5,decimal_places=2) pub_date=models.DateField() #與出版社綁定一對多關系 publish=models.ForeignKey(to=Publish,to_field=nid) #與作者綁定多對多關系(會生成第三張表) authors=models.ManyToManyField(to=Author) def __str__(self): return self.name

執行後生成的表格關系圖,如下:

技術分享圖片

增加數據:

1.一對一表的增加

#增加
#一對一表的增加(Author--AuthorDetail)
    #先創建沒有外鍵的數據,即先建作者詳細表
    # authordetail=AuthorDetail.objects.create(phone=‘3333333‘,email=‘[email protected]‘)
    # print(authordetail,type(authordetail)) #AuthorDetail object <class ‘app01.models.AuthorDetail‘>
    # print(authordetail.email) #[email protected]

    #author建立方式一:手動指定關聯authordetail表
    # author=Author.objects.create(name=‘作者1‘,age=13,authordetail_id=2)
    # print(author) #作者1

    #author建立方式二:可以傳個對象(默認綁定的就是作者詳情表裏面的最後一條記錄)
    # author = Author.objects.create(name=‘作者2‘, age=13, authordetail=authordetail)
    # print(author) #作者2

    #一對多表的增加(Book--Publish)
    # Publish.objects.create(name=‘北京出版社‘,addr=‘北京‘,email=‘[email protected]‘)
    # publish=Publish.objects.create(name=‘南京出版社‘,addr=‘南京‘,email=‘[email protected]‘)
    # print(publish) #南京出版社
    # publish=Publish.objects.create(name=‘廣州出版社‘,addr=‘廣州‘,email=‘[email protected]‘)

    # book=Book.objects.create(name=‘在路上‘,price=23.1,pub_date=‘2011-01-23‘,publish=publish)
    # print(book)  #在路上

    #註意的點,關聯鍵傳的時候要不是手動指定相關表的id號,要不就是只能傳對象,例如下面操作:
    # publish=Publish.objects.filter(name=‘北京出版社‘) #註意這裏拿到的是queryset對象
    # print(publish) #<QuerySet [<Publish: 北京出版社>]>

    # publish = Publish.objects.filter(name=‘北京出版社‘).first() #是對象
    # print(publish)  # 北京出版社
    #手動創建一本書去,通過出版社對象.nid 與對象的‘北京出版社’做綁定
    # book=Book.objects.create(name=‘你若安好‘,price=23,pub_date=‘1991-1-3‘,publish_id=publish.nid)

2.多對多表的增加

#多對多表的添加add(通過Book、Author2張表,在book_authors表裏面錄入信息,完成多對多的綁定關系)
    #方式一:add(作者的id,作者的id)
    # book=Book.objects.create(name=‘紅樓夢‘,price=120,pub_date=‘1891-01-11‘,publish_id=1)
    # print(book)
    # print(book.authors.all(),type(book.authors)) #book.authors類型是manager
    #將紅樓夢書綁定作者1、作者2
    # res=book.authors.add(1,2)
    # ret=book.authors.add(*(2,5))


    #方式二:add(作者的對象)
    #第一步:先拿到你想關聯的作者的對象
    # author=Author.objects.filter(nid=2).first()
    # print(author) #作者2

    #第二步:直接將對象傳給add(),即可以將下面書和上面的作者,在第三種表裏完成綁定關系並錄入
    # book=Book.objects.filter(name=‘便是晴天‘).first()  #記得傳的一定要是對象
    # book.authors.add(author)

解除表之間的綁定關系(remove、clear、set)

#解除綁定
# Remove依次刪除一條或多條
    # book=Book.objects.filter(nid=4).first()
    # print(book)
    #手動指定id結果關聯
    #移除nid=4的書與 nid=2的作者 的綁定
    # res=book.authors.remove(2)
    # print(res)

    #傳對象解除關聯
    # author=Author.objects.filter(nid=2).first()
    # book=Book.objects.filter(nid=3).first()
    # ret=book.authors.remove(author)
    # print(ret) #None

    #如果1本書綁定的有多個作者,可以傳多個值
    # ret=book.authors.remove(2,5)
    # ret=book.authors.remove(*(2,5))


# clear 一次性全部解除綁定關系
    # book = Book.objects.filter(pk=9).first()
    # book.authors.clear()


#set 用法,參數必須傳可叠代對象,可以傳id,也可以傳對象

    #方式一:傳nid
    #先解除所有與書nid=3的所有綁定
    # book=Book.objects.filter(nid=3).first()
    # #再建立一個新的與作者nid=3的綁定
    # res=book.authors.set([3])  #一定是個可叠代的對象
    # print(res)

    #方式二:傳對象
    # book=Book.objects.filter(nid=2).first()
    # #會先執行上面與書2的綁定,再執行下面新的綁定
    # author=Author.objects.filter(nid=2).first() #author是個對象
    # book.authors.set([author]) #傳一個可叠代對象

set( [ 可叠代對象] )的用法圖解:

用法一:

#方式一:傳nid
#先解除所有與書nid=3的所有綁定
# book=Book.objects.filter(nid=3).first()
# #再建立一個新的與作者nid=3的綁定
# res=book.authors.set([3]) #一定是個可叠代的對象
# print(res)

技術分享圖片技術分享圖片

用法二:

#方式二:傳對象
book=Book.objects.filter(nid=2).first()
#會先執行上面與書2的綁定,再執行下面新的綁定
author=Author.objects.filter(nid=2).first() #author是個對象
book.authors.set([author]) #傳一個可叠代對象

  

技術分享圖片

Django多變關聯、增加數據、刪除數據