1. 程式人生 > 其它 >Django之多表操作1

Django之多表操作1

建立模型

建立一個多表模型

from django.db import models

# 表app01_publish
class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20)


# 表app01_book
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=20
) price = models.DecimalField(max_digits=8, decimal_places=2) pub_date = models.DateField() # 表app01_book多對一表app01_publish,引數to指定模型名,引數to_field指定要關聯的那個欄位 publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE) # 我們自己寫sql時,針對書籍表與作者表的多對關係,需要自己建立新表,而基於django的orm,下面這一行程式碼可以幫我們自動建立那張關係表 authors
=models.ManyToManyField(to='Author') # 變數名為authors,則新表名為app01_book_authors,若變數名為xxx,則新表名為app01_book_xxx # 表app01_author class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=20) age = models.IntegerField() # 表app01_author一對一表app01_authordetail author_detail
= models.OneToOneField(to='AuthorDetail',to_field='nid',unique=True,on_delete=models.CASCADE) # 表app01_authordetail class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) tel = models.CharField(max_length=20)

關鍵在於

在建立關聯時,針對引數to,如果傳入的是字串(to="模型名"),則模型類的定義不區分先後順序,如果傳入的是模型名(to=Author),則Author類必須事先定義

新增、刪除、修改記錄

由於foreign key的關係,我們需要事先往app01_publish與app01_authordetail裡插入記錄

# 1、需求:通過模型Publish往表app01_publish裡插入三家出版社
Publish.objects.create(name='北京出版社')
Publish.objects.create(name='長春出版社')
Publish.objects.create(name='大連出版社')

# 2、需求:通過模型AuthorDetail往表app01_authordetail裡插入三條作者詳情
AuthorDetail.objects.create(tel='18611312331')
AuthorDetail.objects.create(tel='15033413881')
AuthorDetail.objects.create(tel='13011453220')

1、多對一:app01_book與app01_publish

# 需求:書籍(葵花寶典、菊花寶典、桃花寶典)都是在北京出版社出版的
# 1、先通過模型Publish從出版社表app01_publish查出北京出版社
publish_obj=Publish.objects.filter(name='北京出版社').first()
# 上述程式碼也可以簡寫為:publish_obj=Publish.objects.get(name='北京出版社')

# 2、再通過模型Book往書籍表app01_book裡插入三本書籍與出版社的對應關係
# 方式一:使用publish引數指定關聯
book_obj1=Book.objects.create(title='葵花寶典',price=2000,pub_date='1985-3-11',publish=publish_obj)

book_obj2=Book.objects.create(title='菊花寶典',price=3000,pub_date='1990-1-21',publish=publish_obj)

book_obj3=Book.objects.create(title='桃花寶典',price=4000,pub_date='1991-1-23',publish=publish_obj)

# 方式二:使用publish_id引數指定關聯
book_obj1=Book.objects.create(title='葵花寶典',price=2000,pub_date='1985-3-11',publish_id=publish_obj.nid)

book_obj2=Book.objects.create(title='菊花寶典',price=3000,pub_date='1990-1-21',publish_id=1) # 在已經出版社id的情況下,可以直接指定

book_obj3=Book.objects.create(title='桃花寶典',price=4000,pub_date='1991-1-23',publish_id=1)

# 注意:無論方式一還是方式二得到的書籍物件book_obj1、book_obj2、book_obj3
#      都可以呼叫publish欄位來訪問關聯的那一個出版社物件
#      都可以呼叫publish_id來訪問關聯的那一個出版社物件的nid
print(book_obj1.publish,book_obj1.publish_id) 
print(book_obj2.publish,book_obj2.publish_id) 
print(book_obj3.publish,book_obj3.publish_id)
# 三本書關聯的是同一個出版社,所以輸出結果均相同

參照上述步驟,把剩餘三本書與出版社的對應關係也插入

book_obj1 = Book.objects.create(title='玉女心經', price=5000, pub_date='1988-3-24', publish_id=2)

book_obj2 = Book.objects.create(title='玉男心經', price=3000, pub_date='1985-6-17', publish_id=2)

book_obj3 = Book.objects.create(title='九陰真經', price=6000, pub_date='1983-8-17', publish_id=3)

2、一對一:app01_author與app01_authordetail

# 需求:插入三個作者,並與作者詳情表一一對應
# 由於作者詳情表我們已經事先建立好記錄,所以只需要往作者表插入記錄即可
# 方式一:需要事先過濾出作者詳情的物件,然後通過模型Author的欄位author來指定要關聯的作者詳情物件(略)

# 方式二:確定作者詳情物件的id,然後通過模型Author通過欄位author_id來指定關聯關係,
Author.objects.create(name='egon',age=18,author_detail_id=1)
Author.objects.create(name='kevin',age=38,author_detail_id=2)
Author.objects.create(name='rose',age=28,author_detail_id=3)

3、多對多:app01_book與app01_author

# 我們參照物理表app01_book_authors制定需求,需要建立如下關係
# 1、葵花寶典的作者為:egon、kevin
# 2、菊花寶典的作者為:egon、kevin、rose
# 3、桃花寶典的作者為:egon、kevin
# 4、玉女心經的作者為:kevin、rose
# 5、玉男心經的作者為:kevin
# 6、九陰真經的作者為:egon、rose

# 需要創建出上述關係,具體做法如下
# 1、先獲取書籍物件
book_obj1=Book.objects.get(title='葵花寶典')
book_obj2=Book.objects.get(title='菊花寶典')
book_obj3=Book.objects.get(title='桃花寶典')
book_obj4=Book.objects.get(title='玉女心經')
book_obj5=Book.objects.get(title='玉男心經')
book_obj6=Book.objects.get(title='九陰真經')

# 2、然後獲取作者物件
egon=Author.objects.get(name='egon')
kevin=Author.objects.get(name='kevin')
rose=Author.objects.get(name='rose')

# 3、最後依次建立上述關係:在原生SQL中多對多關係涉及到操作第三張關係表,但是在ORM中我們只需要操作模型類Book下的欄位author即可
book_obj1.authors.add(egon,kevin)
book_obj2.authors.add(egon,kevin,rose)
book_obj3.authors.add(egon,kevin)
book_obj4.authors.add(kevin,rose)
book_obj5.authors.add(kevin)
book_obj6.authors.add(egon,rose)