創(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)