Django模型(三)
一、1对1关系映射
关系型数据库的强大之处在于各表之间的关联关系。 Django 提供了定义三种最常见的数据库关联关系的方法:多对一,多对多,一对一
一对一关联使用 OneToOneField来定义一对一关系
就像使用其他类型的 Field 一样:在任意一边模型属性中包含它
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
# BooleanField 在数据库使用 tinyint 类型
serves_hot = models.BooleanField(default=False)
serves_clod= models.BooleanField(default=False)
def __str__(self):
return "%s the restaurant" % self.place.name
二、1对多关系映射
定义一个多对一的关联关系,使用 django.db.models.ForeignKey 类。就和其它 Field字段类型一样,只需要在你模型中添加一个值为该类的属性
ForeignKey类需要多的一方添加一个参数,即你想要关联的模型类名
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
# BooleanField 在数据库使用 tinyint 类型
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
def __str__(self):
return "%s the restaurant" % self.place.name
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
def __str__(self):
return "%s the waiter at %s" % (self.name, self.restaurant)
三、多对多关系映射
定义一个多对多的关联关系,使用 django.db.models.ManyToManyField 类。就和其他Field字段类型一样,只需要在你模型中添加一个值为该类的属性
ManyToManyField类需要任意模型边添加一个位置参数,即你想要关联的模型类名
class SchoolClass(models.Model):
name = models.CharField(max_length=20)
class Teacher(models.Model):
name = models.CharField(max_length=10)
school_class = models.ManyToManyField(SchoolClass)
四、多对多关系自定义中间表
from django.db import models
class Person(models.Model):
'''
人
'''
name = models.CharField(max_length=32)
class Language(models.Model):
'''
学习的语言
'''
name = models.CharField(max_length=32)
# 建立多对多管理的使用
person_language = models.ManyToManyField(
Person,
through = 'PersonLanguage', # 这是一个字符串,
)
class PersonLanguage(models.Model):
'''
人学了哪门语言
'''
person = models.ForeignKey(Person,on_delete=models.CASCADE)
language = models.ForeignKey(Language,on_delete=models.CASCADE)
level = models.IntegerField(default=1)
五、自关联
自关联就是外键指向自己表模型
5.1、一对多应用
省市区级联
from django.db import models
class Area(models.Model):
name = models.CharField(max_length=32)
pid = models.ForeignKey('self', on_delete=models.CASCADE)
5.2、多对多应用
- 主播与粉丝的关系
- 链接与友情链接
from django.db import models class Person(models.Model): friends = models.ManyToManyField("self")