Django 的多表操作

創(chuàng)建模型

實(shí)例:我們來假定下面這些概念,字段和關(guān)系

作者模型:一個(gè)作者有姓名和年齡。

作者詳細(xì)模型:把作者的詳情放到詳情表,包含生日,手機(jī)號(hào),家庭住址等信息。作者詳情模型和作者模型之間是一對(duì)一的關(guān)系(one-to-one)

出版商模型:出版商有名稱,所在城市以及email。

書籍模型: 書籍有書名和出版日期,一本書可能會(huì)有多個(gè)作者,一個(gè)作者也可以寫多本書,所以作者和書籍的關(guān)系就是多對(duì)多的關(guān)聯(lián)關(guān)系(many-to-many);一本書只應(yīng)該由一個(gè)出版商出版,所以出版商和書籍是一對(duì)多關(guān)聯(lián)關(guān)系(one-to-many)。

模型建立如下:

from django.db import models

# Create your models here.


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()

    # 與AuthorDetail建立一對(duì)一的關(guān)系
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

class AuthorDetail(models.Model):

    nid = models.AutoField(primary_key=True)
    birthday=models.DateField()
    telephone=models.BigIntegerField()
    addr=models.CharField( max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()


class Book(models.Model):

    nid = models.AutoField(primary_key=True)
    title = models.CharField( max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)

    # 與Publish建立一對(duì)多的關(guān)系,外鍵字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 與Author表建立多對(duì)多的關(guān)系,ManyToManyField可以建在兩個(gè)模型中的任意一個(gè),自動(dòng)創(chuàng)建第三張表
    authors=models.ManyToManyField(to='Author',)

注意事項(xiàng):

1.表的名稱myapp_modelName,是根據(jù) 模型中的元數(shù)據(jù)自動(dòng)生成的,也可以覆寫為別的名稱
2.id 字段是自動(dòng)添加的
3.對(duì)于外鍵字段,Django 會(huì)在字段名上添加"_id" 來創(chuàng)建數(shù)據(jù)庫中的列名
4.這個(gè)例子中的CREATE TABLE SQL 語句使用PostgreSQL 語法格式,要注意的是Django 會(huì)根據(jù)settings 中指定的數(shù)據(jù)庫類型來使用相應(yīng)的SQL 語句。
5.定義好模型之后,你需要告訴Django 使用這些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中設(shè)置,在其中添加models.py所在應(yīng)用的名稱。
6.外鍵字段 ForeignKey 有一個(gè) null=True 的設(shè)置(它允許外鍵接受空值 NULL),你可以賦給它空值 None 。

一對(duì)多

--------------------------方式1---------------------
publish_obj=Publish.objects.get(nid=1)
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish=publish_obj)
方式2:
---------------方式2-------------------
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish_id=1)  

多對(duì)多

# 當(dāng)前生成的書籍對(duì)象
    book_obj=Book.objects.create(title="追風(fēng)箏的人",price=200,publishDate="2012-11-12",publish_id=1)
    # 為書籍綁定的做作者對(duì)象
    yuan=Author.objects.filter(name="yuan").first() # 在Author表中主鍵為2的紀(jì)錄
    egon=Author.objects.filter(name="alex").first() # 在Author表中主鍵為1的紀(jì)錄

    # 綁定多對(duì)多關(guān)系,即向關(guān)系表book_authors中添加紀(jì)錄
    book_obj.authors.add(yuan,egon)    #  將某些特定的 model 對(duì)象添加到被關(guān)聯(lián)對(duì)象集合中。   =======    book_obj.authors.add(*[])

基于對(duì)象的跨表查詢

一對(duì)多查詢(Publish 與 Book)

【正向查詢(按字段 :publish)】

# 查詢主鍵為1的書籍的出版社所在的城市
book_obj=Book.objects.filter(pk=1).first()
# book_obj.publish 是主鍵為1的書籍對(duì)象關(guān)聯(lián)的出版社對(duì)象
print(book_obj.publish.city) 

【反向查詢 (按表:book_set)】

publish=Publish.objects.get(name="蘋果出版社")
#publish.book_set.all() : 與蘋果出版社關(guān)聯(lián)的所有書籍對(duì)象集合
book_list=publish.book_set.all()    
for book_obj in book_list:
       print(book_obj.title)

一對(duì)一查詢(author 和 authorDetail)

【正向查詢 (按字段:authorDetail)】

publish=Publish.objects.get(name="蘋果出版社")
#publish.book_set.all() : 與蘋果出版社關(guān)聯(lián)的所有書籍對(duì)象集合
book_list=publish.book_set.all()    
for book_obj in book_list:
       print(book_obj.title)

【反向查詢 按表名 author】

# 查詢所有住址在北京的作者的姓名
 
authorDetail_list=AuthorDetail.objects.filter(addr="beijing")
for obj in authorDetail_list:
     print(obj.author.name)

多對(duì)多查詢 (Author 與 Book)

【正向查詢(按字段:authors)】

book_obj=Book.objects.filter(title="金瓶眉").first()
authors=book_obj.authors.all()
for author_obj in authors:
     print(author_obj.name,author_obj.authorDetail.telephone)

【反向查詢(按表名:book_set)】

  author_obj=Author.objects.get(name="egon")
    book_list=author_obj.book_set.all()        #與egon作者相關(guān)的所有書籍
    for book_obj in book_list:
        print(book_obj.title)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容