django中的關系字段
1、ForeignKey字段,即外鍵字段,對應一對多的情況,列如:一本書對應一個出版社,一個出版社可對應多本書。
2、ManyToManyFiled字段,即多對多字段,對應數據庫中一個數據相互可以對應多條,列如:一本書可以有多個作者,一個作者可以有多本書
3、OneToOneFiled字段,即一對一字段,通過用來將一條數據補常用的數據單獨存放,例如對於作者來說,姓名、作品等是常被查詢的,而地址、生日這些是補常用的,就可以將這部分數據通過一對一字段對應分表存放
准備工作:
from django.db import models
# Create your models here.
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=12)
addr = models.TextField()
date = models.DateField()
class Book(models.Model):
title = models.CharField(max_length=12)
price = models.DecimalField(max_digits=6,decimal_places=2)
isbn = models.CharField(max_length=20,unique=True)
pulisher = models.ForeignKey(to='Publisher')
class Author(models.Model):
name = models.CharField(max_length=12)
gender=models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
phone=models.CharField(max_length=11,unique=True)
email=models.EmailField()
book = models.ManyToManyField(to='Book',related_name='authors')
info = models.OneToOneField(to='Authorinfo',related_name='infos')
class Authorinfo(models.Model):
birthday=models.DateTimeField()
city=models.CharField(max_length=12)
is_marry=models.BooleanField()
income = models.BigIntegerField()
ForeiKeyField
2、運行django命令:python manage.py makemigrations 和 python manage.py migrate
3、在數據庫中添加數據:
作者表:

作者信息表:

查詢數據的方式:
查詢數據方法主要分為兩種方式:通過對象查詢和通過qureset數據查詢,其中每種方式還對應正向查詢和反向查詢,解釋:例如在上面兩個表中,一對一字段在作者表中那么根據作者表查信息表就是正向查詢,反之為反向查詢
ForeiKeyField正向查詢
通過對象正向查詢
例如查詢id=1的作者的詳細信息:
步驟:
1、獲取id=1的作者對象
2、通過一對一字段獲取對象
3、調用字段屬性
在django腳本中:
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
import django
django.setup()
from app01 import models
#獲取id =1 的數據對象
obj = models.Author.objects.get(id=1)
#通過.一對一字段名的方式獲取信息表對象並查看屬性
print(obj.info.country,obj.info.city)
運行結果:
英國 倫敦
通過對象反向查詢
查詢國家=英國 城市=倫敦的的作者
步驟:
1、獲取滿足條件的作者信息表對象
2、通過.表名方法獲取對象(當一對一字段有related_name參數時,用該參數的值替代表名_set)
from django.db import models
# Create your models here.
class Author(models.Model):
#姓名字段
name = models.CharField(max_length=12)
#性別字段,choices參數對應選擇1、2、3
gender = models.SmallIntegerField(choices=((1,'男'),(2,'女'),(3,'保密')),default=3)
#一對一字段,related_name參數為反向查找時的別名。沒有別名反向查找時用
info = models.OneToOneField(to='Authorinfo',related_name='infos')
class Authorinfo(models.Model):
#年齡字段
age = models.SmallIntegerField()
#國籍
country = models.CharField(max_length=12)
#城市
city = models.CharField(max_length=12)
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
import django
django.setup()
from app01 import models
#獲取信息表對象
obj = models.Authorinfo.objects.get(country='英國',city='倫敦')
#通過related_name='infos'反向查詢
print(obj.infos.get_gender_display())
如果 info = models.OneToOneField(to='Authorinfo',related_name='infos')中沒有related_name參數,則是如下:
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day65blog.settings")
import django
django.setup()
from app01 import models
#獲取信息表對象
obj = models.Authorinfo.objects.get(country='英國',city='倫敦')
#通過表名(小寫)反向查詢
print(obj.author.get_gender_display())
通過qureset查詢
正向查詢
查詢id=1的作者的國家
步驟:
1、獲取作者query對象
2、通過字段__方法
#正向查找
#獲取queryset數據
ret = models.Author.objects.filter(id=1)
#通過字段__方法調用屬性
print(ret.values('info__city'))
#運行結果:
# < QuerySet[{'info__city': '倫敦'}] >
反向查詢
#反向查詢
# 獲取queryset數據
ret = models.Authorinfo.objects.filter(city='倫敦')
# 通過表名__方法調用屬性
# 如果一對一字段有設置related_name參數=infos,表名__=infos
print(ret.values('author__name'))
ForeignKey
書籍應出版社為1對多關系即為外鍵
通過對象正向查詢
查詢id=1的書籍的出版社,方法:對象.關聯字段.外表字段
#獲取對象
obj =Book.objects.get(id=1)
#對象.字段名.外表屬性
print(obj.pulisher.name)
通過對象反向查詢
查詢出版社id=1 的出版社出版的書籍
#獲取出版社對象
ret = Publisher.objects.get(id=1)
#對象.表名_set(反向一對多用,反向一對一為對象.表名)得到反向表對象然后調用方法
ret.book_set.all()
通過qureset查詢
#正向查詢書籍id=1的出版社
ret = Book.objects.filter(id=1)
print(ret.values('pulisher__name'))
#反向查詢id=1出版社出版的書
ret2= Publisher.objects.filter(id=1)
print(ret2.values('book__title'))
ManyToManyField
書籍和作者之間為多對多關系
#通過對象查詢
#反向查詢related_name = authors
obj = Book.objects.get(id=1)
obj.authors.all()
#正向查詢
obj1 = Author.objects.get(id=1)
obj1.book.all()
#通過queryset查詢
#正向查詢
print(Author.objects.filter(id=1).values('book__title'))
#反向查詢
print(Book.objects.filter(id=1).values('authors__name'))
總結:

