Django模型層之多表操做

1、建立多表模型

實例:git

做者表:
    擁有字段:姓名(name),性別(sex),該表與書籍表之間爲多對多的關係
做者詳情表:
    擁有字段:地址(addr),手機號(phone),該表與做者表之間爲一對一的關係
出版社表:
    擁有字段:名字(name),地址(addr),該表與書籍表之間爲一對多的關係
書籍表:
    擁有字段:書名(name),單價(price)
分析:一本書能夠擁有多個做者,一個做者能夠寫多本書,全部做者與書籍之間爲多對多的關聯關係(Many-To-Many);一本書只有一個出版社,可是一個出版社能夠出版多種書籍,因此出版社和書籍之間是一對多的關聯關係(One-To-Many);做者與做者詳情就是一對一關聯關係(One-To-One)

在models.py下建立模型以下:數據庫

class Publish(models.Model):
    name = models.CharField(max_length=255)
    addr = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    sex = models.IntegerField()
    authordetail = models.OneToOneField(to='AuthorDetail')

    def __str__(self):
        return self.name


class AuthorDetail(models.Model):
    id = models.AutoField(primary_key=True)
    addr = models.CharField(max_length=255)
    phone = models.CharField(max_length=255)


class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 外鍵,關聯關係寫在一對多中多的那一方
    publish = models.ForeignKey(to=Publish)
    authors = models.ManyToManyField(to=Author)

    def __str__(self):
        return self.name

注意事項;spa

1.id字段不寫的話會自動添加
2.對於外鍵字段,Django會在字段名上添加"_id"來建立數據庫中的列名
3.外鍵字段ForeignKey有一個null=True的設置,你能夠賦給它空值None

2、添加表記錄

一對一:code

# 方式一:
detail_obj = models.AuthorDetail.objects.filter(id=2).first()
models.Author.objects.create(name='Yven',sex=1,authordetail=detail_obj)

# 方式二:
models.Author.objects.create(name='hwt',sex=2,authordetail_id=1)

一對多:對象

# 方式一:
publish_obj = models.Publish.objects.filter(id=2).first()
models.Book.objects.create(name='水滸傳',price=24.5,publish=publish_obj)

# 方式二:
models.Book.objects.create(name='西遊記',price=24.5,publish_id=2)

多對多:blog

# 得到書籍對象
book = models.Book.objects.create(name='水滸傳',price=24.5,publish_id=3)
# 得到做者對象
yven = models.Author.objects.get(name='Yven')
hwt = models.Author.objects.get(name='hwt')

# 綁定多對多關係
# add中能夠傳遞對象,能夠傳遞id,也能夠傳遞*列表如:(*[yven,hwt])
book.authors.add(yven,hwt)

#多對多關係其餘經常使用API:
# 將某個特定的對象從被關聯對象集合中去除,能夠傳遞對象,能夠傳遞id,也能夠傳遞*列表如:(*[yven,hwt])
book.authors.remove()
# 清空被關聯對象集合,無需傳參
book.authors.clear()
# 先清空再設置,傳遞的參數必須是可迭代對象,通常爲列表,列表內能夠是對象,也能夠是id
book.authors.set()

3、基於對象的跨表查詢

一對一:ci

#正向:關聯字段在哪裏,從哪裏開始就是正向。正向查詢按字段
#查詢小明做者的手機號
author = models.Author.objects.filter(name='小明').first()
authordetail = author.authordetail#authordetail是字段名
print(authordetail.phone)

#反向:反向查詢按表名小寫
#查詢地址是北京的做者名字
authordetail = models.AuthorDetail.objects.filter(addr='北京').first()
author = authordetail.author#author是表名
print(author.name)

一對多:rem

#正向:正向查詢按字段
# 查詢紅樓夢這本書的出版社郵箱
book = models.Book.objects.filter(name='紅樓夢').first()
publish = book.publish
print(publish.email)

#反向:反向按表名小寫_set.all()
# 查詢地址是北京 的出版社出版的圖書
publish = models.Publish.objects.filter(addr='北京').first()
book = publish.book_set.all()
print(book)

多對多:get

#正向:正向查詢按字段.all()
#查詢紅樓夢這本書全部的做者
book = models.Book.objects.filter(name='紅樓夢').first()
author = book.authors.all()
print(author)

#反向查詢:反向按表名小寫_set.all()
#查詢小明寫的全部書
author = models.Author.objects.filter(name='小明').first()
book = author.book_set.all()
print(book)

注:基於對象的查詢,其本質就是屢次查詢(子查詢)it

4、基於雙下劃線的跨表查詢

Django還提供了一種直觀而搞笑的方式在查詢(lookups)種表示關聯關係,它能自動確認SQL JOIN聯繫。要作跨關係查詢,就使用兩個下劃線來鏈接模型(model)間關聯字段的名稱,知道最終連接到你想要的model爲止。

一對一查詢:

正向查詢(按字段):authordetail
# 查詢Yven的地址
models.Author.objects.filter(name='Yven').values('authordetail__addr')


反向查詢(按表名):author
# 查詢Yven的地址
models.AuthorDetail.objects.filter(author__name='Yven').values('addr')

一對多查詢:

正向查詢(按字段):publish
# 查詢西遊記的出版社名
models.Book.objects.filter(name='西遊記').values('publish__name')


反向查詢(按表名):book
# 查詢西遊記的出版社名
models.Publish.objects.filter(book__name='西遊記').values('name')

多對多查詢:

正向查詢(按字段):authors
# 查詢水滸傳的做者性別
models.Book.objects.filter(name='水滸傳').values('authors__sex')


反向查詢(按表名):book
# 查詢水滸傳的做者性別
models.Author.objects.filter(book__name='水滸傳').values('sex')
相關文章
相關標籤/搜索