創(chuàng)建模型
實(shí)例:我們來假定下面這些概念蹦魔,字段和關(guān)系
1、作者模型:一個(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)。
Book
id title price publish
php 100 人民出版社
python 200 北京出版社
go 100 人民出版社
java 300 上海出版社
為了存儲(chǔ)出版社的郵箱屿岂,地址践宴,在第一個(gè)表后面加字段
Book
id title price publish email addr
php 100 人民出版社 111 北京
python 200 北京出版社 222 北京
go 100 人民出版社 111 北京
java 300 上海出版社 111 上海
這樣會(huì)有大量重復(fù)的數(shù)據(jù),浪費(fèi)空間
####################################################################################
一對(duì)多:一個(gè)出版社對(duì)應(yīng)多本書(關(guān)聯(lián)信息建在多的一方爷怀,也就是book表中)
Book
id title price publish_id
php 100 1
python 200 1
go 100 2
java 300 1
Publish
id name email addr
人民出版社 111 北京
上海出版社 222 上海
總結(jié):一旦確定表關(guān)系是一對(duì)多:在多對(duì)應(yīng)的表中創(chuàng)建關(guān)聯(lián)字段(在多的表里創(chuàng)建關(guān)聯(lián)字段) 浴井,publish_id
查詢python這本書的出版社的郵箱(子查詢)
select publish_id from Book where title=“python”
select email from Publish where id=1
####################################################################################
多對(duì)多:一本書有多個(gè)作者,一個(gè)作者出多本書
Book
id title price publish_id
php 100 1
python 200 1
go 100 2
java 300 1
Author
id name age addr
alex 34 beijing
egon 55 nanjing
Book2Author
id book_id author_id
2 1
2 2
3 2
總結(jié):一旦確定表關(guān)系是多對(duì)多:創(chuàng)建第三張關(guān)系表(創(chuàng)建中間表霉撵,中間表就三個(gè)字段磺浙,自己的id,書籍id和作者id) :
id book_id author_id
# alex出版過的書籍名稱(子查詢)
select id from Author where name='Alex'
select book_id from Book2Author where author_id=1
select title from Book where id =book_id
####################################################################################
一對(duì)一:對(duì)作者詳細(xì)信息的擴(kuò)展(作者表和作者詳情表)
Author
id name age ad_id(UNIQUE)
alex 34 1
egon 55 2
AuthorDetail
id addr gender tel gf_name author_id(UNIQUE)
beijing male 110 小花 1
nanjing male 911 杠娘 2
總結(jié): 一旦確定是一對(duì)一的關(guān)系:在兩張表中的任意一張表中建立關(guān)聯(lián)字段+Unique
====================================
Publish
Book
Author
AuthorDetail
Book2Author
CREATE TABLE publish(
id INT PRIMARY KEY auto_increment ,
name VARCHAR (20)
);
CREATE TABLE book(
id INT PRIMARY KEY auto_increment ,
title VARCHAR (20),
price DECIMAL (8,2),
pub_date DATE ,
publish_id INT ,
FOREIGN KEY (publish_id) REFERENCES publish(id)
);
CREATE TABLE authordetail(
id INT PRIMARY KEY auto_increment ,
tel VARCHAR (20)
);
CREATE TABLE author(
id INT PRIMARY KEY auto_increment ,
name VARCHAR (20),
age INT,
authordetail_id INT UNIQUE ,
FOREIGN KEY (authordetail_id) REFERENCES authordetail(id)
);
CREATE TABLE book2author(
id INT PRIMARY KEY auto_increment ,
book_id INT ,
author_id INT ,
FOREIGN KEY (book_id) REFERENCES book(id),
FOREIGN KEY (author_id) REFERENCES author(id)
)
分析如下
注意:關(guān)聯(lián)字段與外鍵約束沒有必然的聯(lián)系(建管理字段是為了進(jìn)行查詢徒坡,建約束是為了不出現(xiàn)臟數(shù)據(jù))
2撕氧、在Models創(chuàng)建如下模型
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
publish_date = models.DateField()
# 閱讀數(shù)
# reat_num=models.IntegerField(default=0)
# 評(píng)論數(shù)
# commit_num=models.IntegerField(default=0)
publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
authors=models.ManyToManyField(to='Author')
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)
class AuthorDatail(models.Model):
nid = models.AutoField(primary_key=True)
telephone = models.BigIntegerField()
birthday = models.DateField()
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()
生成的表如下:
注意事項(xiàng):
表的名稱myapp_modelName,是根據(jù) 模型中的元數(shù)據(jù)自動(dòng)生成的喇完,也可以覆寫為別的名稱
id字段是自動(dòng)添加的
對(duì)于外鍵字段伦泥,Django 會(huì)在字段名上添加"_id" 來創(chuàng)建數(shù)據(jù)庫中的列名
這個(gè)例子中的CREATE TABLE SQL 語句使用PostgreSQL 語法格式,要注意的是Django 會(huì)根據(jù)settings 中指定的數(shù)據(jù)庫類型來使用相應(yīng)的SQL 語句。定義好模型之后不脯,你需要告訴Django 使用這些模型府怯。你要做的就是修改配置文件中的INSTALL_APPSZ中設(shè)置,在其中添加models.py所在應(yīng)用的名稱防楷。
外鍵字段 ForeignKey 有一個(gè) null=True 的設(shè)置(它允許外鍵接受空值 NULL)牺丙,你可以賦給它空值 None 。