1. 程式人生 > >django的多表操作

django的多表操作

opened 例子 reat max ima bigint man all -m

django的多表操作

1.使用場景

在實際生產過程多,我們面對的數據紛繁復雜,此時就需要良好的數據結構設計,多表之間的約束關系為我們提供了數據管理以及查詢的便利。在MYsql中我們利用外鍵(foreign key)來實現這樣的約束關系,在django中我們通過調用相應的API來實現這樣的功能。

2.創建模型

實例:我們來假定下面這些概念,字段和關系

  • 作者模型:一個作者有姓名和年齡。作者詳細模型:把作者的詳情放到詳情表,包含生日,手機號,家庭住址等信息。作者詳情模型和作者模型之間是一對一的關系(one-to-one)

  • 出版商模型:出版商有名稱,所在城市以及email。
  • 書籍模型: 書籍有書名和出版日期,一本書可能會有多個作者,一個作者也可以寫多本書,所以作者和書籍的關系就是多對多的關聯關系(many-to-many);
  • 一本書只應該由一個出版商出版,所以出版商和書籍是一對多關聯關系(one-to-many)

模型建立的代碼(module)如下:

技術分享圖片
 1 from django.db import models
 2 # Create your models here.
 3 
 4 class Author(models.Model):
 5     nid = models.AutoField(primary_key=True)
6 name=models.CharField( max_length=32) 7 age=models.IntegerField() 8 9 # 與AuthorDetail建立一對一的關系 10 authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) 11 12 class AuthorDetail(models.Model): 13 14 nid = models.AutoField(primary_key=True) 15
birthday=models.DateField() 16 telephone=models.BigIntegerField() 17 addr=models.CharField( max_length=64) 18 19 class Publish(models.Model): 20 nid = models.AutoField(primary_key=True) 21 name=models.CharField( max_length=32) 22 city=models.CharField( max_length=32) 23 email=models.EmailField() 24 25 class Book(models.Model): 26 27 nid = models.AutoField(primary_key=True) 28 title = models.CharField( max_length=32) 29 publishDate=models.DateField() 30 price=models.DecimalField(max_digits=5,decimal_places=2) 31 32 # 與Publish建立一對多的關系,外鍵字段建立在多的一方 33 publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) 34 # 與Author表建立多對多的關系,ManyToManyField可以建在兩個模型中的任意一個,自動創建第三張表 35 authors=models.ManyToManyField(to=Author,)
View Code

在MYSQL生成的表如下:

技術分享圖片

註意事項:

  • 表的名稱myapp_modelName,是根據 模型中的元數據自動生成的,也可以覆寫為別的名稱  
  • id 字段是自動添加的
  • 對於外鍵字段,Django 會在字段名上添加"_id" 來創建數據庫中的列名
  • 這個例子中的CREATE TABLE SQL 語句使用PostgreSQL 語法格式,要註意的是Django 會根據settings 中指定的數據庫類型來使用相應的SQL 語句。
  • 定義好模型之後,你需要告訴Django _使用_這些模型。你要做的就是修改配置文件中的INSTALL_APPSZ中設置,在其中添加models.py所在應用的名稱。
  • 外鍵字段 ForeignKey 有一個 null=True 的設置(它允許外鍵接受空值 NULL),你可以賦給它空值 None

3.添加表數據

在進行多表操作前,先創建一些基礎的表數據:

publish表:

技術分享圖片

authordetail表:

技術分享圖片

author表:

技術分享圖片

3.1 一對多

book就是一對多的例子:

技術分享圖片
方式1:
   publish_obj=Publish.objects.get(nid=1)
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish=publish_obj)

方式2:
   book_obj=Book.objects.create(title="金瓶眉",publishDate="2012-12-12",price=100,publish_id=1)
View Code

技術分享圖片

3.2 多對多

技術分享圖片
# 當前生成的書籍對象
    book_obj=Book.objects.create(title="追風箏的人",price=200,publishDate="2012-11-12",publish_id=1)
    # 為書籍綁定的做作者對象
    yuan=Author.objects.filter(name="yuan").first() # 在Author表中主鍵為2的紀錄
    egon=Author.objects.filter(name="alex").first() # 在Author表中主鍵為1的紀錄

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

數據庫表紀錄生成如下:
book表

技術分享圖片

book_authors表

技術分享圖片

核心:book_obj.authors.all()是什麽?
多對多關系其它常用API

book_obj.authors.remove()      # 將某個特定的對象從被關聯對象集合中去除。    ======   book_obj.authors.remove(*[])
book_obj.authors.clear()       #清空被關聯對象集合
book_obj.authors.set()         #先清空再設置

test

django的多表操作