表关系一:ForignKey、ManyToManyField、OneToOneField
2.Field
Field类型:字段类型,django有众多的Field类型:CharField、IntegerField、DatetimeField.........
Field类型还有两个作用,一是定义的是什么类型的数据,从数据库取出来以后就是什么类型的数据;二是还可以作类型校验
Field参数:常见的有:null、blank、choices、default、help_text提示信息、primary_key、unique唯一键、verbose_name前端展视的名字(用于modelForm)..........
表之间关系:多对一ManyToOne,使用外键ForeignKey ;多对多ManyToMany,使用ManyToManyField,会自动增加一张关系表;一对一OneToOne,使用OneToOneField
个人理解:如果对于双方,都是一对一的关系,那么是一对一的关系;如果对于一方是多对一,对另一方是一对一,那么是多对一的关系;如果对于方,都是多对一的关系,那么是多对多的关系。
如:一本书只能由一个出版社出版(一对一),一个出版社可以出版多本书,那么是一对多的关系,通常在小的一方(如书,是更小的一方或者说是多的一方)的model类中定义ForeignKey,如publisher = models.ForeignKey(Publisher)。
一本书可能有多个作者(一对多),一个作者可以写作多本书(一对多),那么是多对多的关系,如果在本的models中定义,则为author=models.ManyToManyField(Author),或者在作者的models 中定义,则为
book=models.ManyToManyField(Book);只需要在任意一个表中定义一个ManyToManyField即可。
一个任务可以包含多个计划,一对多;一个计划只能属于一个任务,一对一,因此是多对一的关系。
一个计划可以包含多个模块,一对多;一个模块只能属于一个计划,一对一,因此是多对一的关系。
在比较两个表的关系的时侯,强调的是一个**对应**,如一个***对应一个***,或者一个**对应多个***。
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
website = models.URLField()
def __unicode__(self):
return self.name
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
def __unicode__(self):
return '{} {}'.format(self.first_name, self.last_name)
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
多对多的查询:
# 如果定义了多对多,可以直接用ORM反查 book=Book.objects.get(id=1) # 获取一本书 book.authors.all() # 获取一本书对应的所有作者。ManyToMany定义在book类,多对多的field为authors,所以这里是通过book.authors来获取 author = author.objects.get(id=1) # 获取一个作者 author.book_set.all() #获取一个作者对应的所有书。ManyToMany未定义在本类author中,因此不通过多对多字段来查询,但可以通过author.book_set来反查。只要定义了多对多,是可以这样反查的,djanog是知道它们的多对多的关系的。
多对多的关系,可以拆分:
新建一张关系表,如AuthorBook,拆分为两个多对一关系,一本书可以有多个作者,一个作者可以有多本书,即两个外键。同ManyToMany的关系是一样的,但是不能使用ManyToMany的ORM。
class AuthorBook(models.Model):
book = models.ForeignKey(Book) # 多对一关系之一:一本书可以对应多个作者
author = models.ForeignKey(Author) # 多对一关系之二:一个作者可以对应多本书
此时,怎么查?
class Car(models.Model): #一辆车只能属于一个品牌,但一个品牌有多辆车;多对一关系 manufacturer = models.ForeignKey(关联表对应的类) class User(models.Model): #一个组包含多个用户,一个用户属于多个组;多对多关系 groups = ManyToManyField(关联表对应的类) class Restaurant(models.Model): #一个位置一个餐馆;一对一关系 place = OneToOneField(Place, primary_key=True)
posted on 2018-06-06 20:39 myworldworld 阅读(223) 评论(0) 收藏 举报