表关系一: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)    收藏  举报

导航