1.多对一关系
django使用django.db.models.ForeignKey定义多对一关系
.ForeignKey需要一个参数:就是外键连接
class PeopleInfo(models.Model):
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')
# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
name = models.CharField(max_length=20, verbose_name='名称')
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
verbose_name_plural=verbose_name
def __str__(self):
return self.name
1.1.2 多对一关系的蹭删改操作
添加书籍:
BookInfo.objects.create(
name="python",
pub_date="2002-02-27",
read_count=200,
comment_count=100,
)
删除书籍:
BookInfo.objects.filter(name="python").delete()
修改书籍:
BookInfo.objects.filter(name="python").update(sale_out=True)
2.一对一关系
模型类使用OneToOneField
用来定义一对一关系;
2.1.2一对一关系增删改查操作
>>> t1 = Teacher.objects.create(name='Jack',age='22')
>>> t2 = Teacher.objects.create(name='Bob',age='17')
>>> p1 = Professor.objects.create(teacher=t1,big_project='雾霾净化术')
>>> p1.teacher
<Teacher: Jack>
>>> p1.teacher = t2
>>> p1.save()
2.1.3一对一关系正向查询
# 正向查询:通过教授,查询对应的讲师信息
>>> p1.teacher
<Teacher: Bob>
2.1.4一对一关系反向查询
# 反向查询:通过讲师,查询教授信息, 反向查询时,只需要 模型类 本身即可
t1.professor.name
3.多对多关系
多对多关系在模型中使用ManyToManyField
字段定义
多对多关系可以是具有关联,也可以是没有关联,所以不需要明确指定on_delete
属性
生活中,多对多关系:一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队一个文章中可以有很多标签,一个标签也可出现在很多文章中在多对多关系中专门有第三张表来存储对应关系,表本身之间没有任何关联,此时删除和修改数据不影响另外一张表from
django.db import models
# 一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队
# 定义音乐家模型类
class Artist(models.Model):
artist_name = models.CharField(max_length=20,verbose_name="音乐家名字")
# 定义元类
class Meta:
db_table = "artist1"
def __str__(self):
return self.artist_name
# 定义乐队模型类
class Band(models.Model):
band_name = models.CharField(max_length=20,verbose_name="乐队名")
# 多对多
artist = models.ManyToManyField(Artist)
# 定义元类
class Meta:
db_table = "band"
def __str__(self):
return self.band_name