Django之modles 多對多建立第三張表

2022-01-30 22:23:38 字數 3146 閱讀 2688

一.第一種:純自動建立第三張表

純自動

class

book(models.model):

title = models.charfield(max_length=32)

price = models.decimalfield(max_digits=8, decimal_places=2)

authors = models.manytomanyfield(to='

author')

class

author(models.model):

name = models.charfield(max_length=32)

age = models.integerfield()

優點:可以利用雙下劃線和物件點語法 正向 反向 

缺點:第三張表的字段 被限定死了 拓展性極差

二.第二種純手動建立第三張表

class

book(models.model):

title = models.charfield(max_length=32)

price = models.decimalfield(max_digits=8, decimal_places=2)

class

author(models.model):

name = models.charfield(max_length=32)

age =models.integerfield()

# 純手動建立第三張表

class

book2author(models.model):

book = models.foreignkey(to='

book')

author = models.foreignkey(to='

author')

#基於第一種沒有辦法拓展我們第三張表中的字段 純自動固定只有我們的book和author 拓展性極差

info = models.charfield(max_length=64)

test 測試**

import

osimport

sysif

__name__ == "

__main__":

os.environ.setdefault(

"django_settings_module

", "

test_22.settings")

import

django

django.setup()

models

#res = models.book.objects.filter(pk=1).values('author__name')

#print(res) # 基於雙下劃線反向表名也不行了

book_obj = models.book.objects.filter(pk=1).first()

print(book_obj.author__set.all()) #

attributeerror: 'nonetype' object has no attribute 'author__set

#基於物件單向表名小寫_set >>>反向結果維多必須加_set

#這種方法也不行 查不了 所學知識沒辦法查啊

優點:第三張表可以新增其他字段拓展性高 

缺點:沒辦法進行正向 反向 __雙下劃線 和 物件點語法查詢 正向字段沒有字段 所以沒有辦法利用orm 查詢

三.第三種半自動 半手動

全是優點:以後開發基本就是用第三種

class

book(models.model):

title = models.charfield(max_length=32)

price = models.decimalfield(max_digits=8, decimal_places=2)

authors = models.manytomanyfield(to='

author

', through='

book2author

', through_fields=('

book

', '

author'))

class

author(models.model):

name = models.charfield(max_length=32)

age =models.integerfield()

class

book2author(models.model):

book = models.foreignkey(to='

book')

buthor = models.foreignkey(to='

author')

#基於第一種沒有辦法拓展我們第三張表中的字段 純自動固定只有我們的book和author 拓展性極差

info = models.charfield(max_length=64)

圖形理解

注意點:

#有時資料庫的原因會將資料卡主 需要手動更新 不然查不到資料

正向 反向 查

#

正向查#

book_obj = models.book.objects.filter(pk=1).first()

#print(book_obj.authors.all()) # ]>

#正向按欄位 結果為多的.all() 即可

#反向查 作者為yyy的書籍名稱

res = models.author.objects.filter(name='

yyy').values('

book__title')

print(res) #

Django之model F Q以及多對多操作

打個比方吧,有一張表,儲存著公司員工的工資,公司普漲工資,如何在model中操作,這就用到了f,首先需要匯入此模組 from django.db.models import f操作 models.userinfo.objects.filter update salary f salary 500 m...

Django多對多操作

模型 from django.db import models 老師 class teacher models.model name models.charfield max length 32 學生 class student models.model name models.charfield ...

Django多對多的建立

1.多對多建立的應用場景 在某錶中建立一行資料是,有乙個可以多選的下拉框 例如 建立使用者資訊,需要為使用者指定多個愛好 2.建立方式 方式一 自定義關係表,手動建立一張表用於關聯其他多張表的關係 class host models.model nid models.autofield primar...