模型_02
一、关联关系
1、概述
关联关系指的是数据表之间的数据是相互依赖和影响关系,表之间有从属关系,比如,有一个用户表,用户又有订单表,则用户表与订单表之间就存在从属关系。
2、关联关系的种类
- 一对一 一个人一本护照
- 一对多 一个部门可以有多个员工
- 多对多 一个学生有多门课,一门课有多个学生
3、Model中的关联关系
3.1 关系类型字段
- ForeignKey(to=关系对方的类或类名或‘self’,on_delete=级联选项)
- OneToOneField(to=关系对方的类或类名或‘self’,on_delete=级联选项)
- ManyToManyField(to=关系对方的类或类名或‘self’)
4、关联关系Model搭建
4.1 一对多Model
1 2 3 4 5 6 7 8 9 10 11 12 13
| 1:* class Category(models.Model): title = models.CharField(max_length=20) note = models.CharField(max_length=20) class Meta: db_table="t_category"
class Goods(models.Model): title = models.CharField(max_length=20,unique=True) price = models.FloatField() cate = models.ForeignKey(to=Category,on_delete=models.CASCADE) class Meta: db_table = "t_goods"
|
4.2 一对一Model
1 2 3 4 5 6 7 8 9 10 11 12
| 1:1 class Passport(models.Model): note = models.CharField(max_length=20) person = models.OneToOneField(to="Person",on_delete=models.CASCADE,null=True) class Meta: db_table="t_passport"
class Person(models.Model): name = models.CharField(max_length=20) age = models.IntegerField() class Meta: db_table="t_person"
|
4.3 多对多Model
1 2 3 4 5 6 7 8 9 10 11 12 13
| *:* class Student(models.Model): name = models.CharField(max_length=20) age = models.IntegerField() class Meta: db_table="t_student" class Course(models.Model): title = models.CharField(max_length=30) expire = models.SmallIntegerField() stu = models.ManyToManyField(to=Student) class Meta: db_table="t_course"
|
5、关联关系查询
5.1 一对一查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| pn = Person.objects.all() pt = Passport.objects.all()
pn[0].passport pt[0].per
pn[0].passport.country pt[0].per.name
Person.objects.filter(passport__country__contains="中") Person.objects.filter(passport__country="中国") Person.objects.filter(passport__id=1)
Passport.objects.filter(per__id=1) Passport.objects.filter(per__id__gt=1) Passport.objects.filter(per__name__contains="z")
Person.objects.filter(passport__country='USA').values('id','name','age','passport__country')
|
5.2 一对多查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
cs = Category.objects.all() gs = Goods.objects.all()
cs[0].goods_set cs[0].goods_set.filter(price__gt=200) cs[0].goods_set.all()
gs[0].cate gs[0].cate.title
Goods.objects.filter(cate__gte=1) Goods.objects.filter(cate__title__contains="xx") Goods.objects.filter(cate__pk__gte=1) Goods.objects.filter(cate__id__gte=1) Goods.objects.filter(cate__title__contains="s")
Category.objects.filter(goods__gt=1) Category.objects.filter(goods__pk__gt=1) Category.objects.filter(goods__title__contains="a")
Goods.objects.filter(cate__title__contains="s").values("cate__title","pk","price")
list(set(Category.objects.filter(goods__price__gt=200)))
|
5.3 多对多查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
stus = Student.objects.all() cours = Course.objects.all()
stus[0].course_set stus[0].course_set.all() stus[0].course_set.filter(title__contains='s')
cours[0].stu.all() cours[0].stu.filter(age__gt=18)
Student.objects.filter(course__title__contains="h") Course.objects.filter(stu__name="zzz") Course.objects.filter(stu__age__gt=18)
|
6、增加数据
1 2
| c = Category.objects.create(title="男装",...) c.save()
|
1 2 3 4 5 6 7 8 9
| c = Category.objects.filter(pk=1) c.goods_set.create(title = 'abc',price=139.99)
c = Category.objects.get(pk=1) g = Goods.objects.create(title='abc',price=213,cate=c)
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| c = Category(title="类别1",note="xx") g = Goods(title="zzz6",price=100) g.save() c.save() c.goods_set.add(g)
或
c = Category(title="类别1",note="xx") c.save() g = Goods(title="zzz6",price=100,cate9=c) g.save()
|
7、删除数据
1
| Goods.objects.get(pk=1).delete()
|
*:* 不支持级联删除
1 2 3 4 5 6 7 8 9 10 11 12
| per = models.OneToOneField(to=Person,on_delete=models.SET_NULL,null=True)
per = models.OneToOneField(to=Person,on_delete=models.CASCADE,null=True)
per = models.OneToOneField(to=Person,on_delete=models.DO_NOTHING,null=True)
cate = models.ForeignKey(to="Category",on_delete=models.SET(6))
cate = models.ForeignKey(to="Category",on_delete=models.SET_DEFALUT,default="5")
cate = models.ForeignKey(to="Category",on_delete=models.PROTECT)
|
8、修改数据
查询出数据,修改属性,然后save()即可
1 2 3 4 5 6 7 8 9 10 11 12
| cs = Category.objects.all() c = cs[0] c.title="new_title" c.save()
Category.objects.all()[0].title="new_title" Category.objects.all()[0].save()
cate1=Category.objects.all()[0] cate1.title="new_title" cate1.save()
|
二、懒加载Lazy-load
QuerySet在查询数据时,是延迟执行,直到真正使用了数据,才发起查询
1 2 3 4 5 6 7 8 9
| a = Person.objects.all() b = Category.objects.all() print(a)
c = Category.objects.all() print(c) goods = c[0].goods_set.all() print(goods)
|
1 2 3 4 5 6 7 8 9
| # SERVER SECTION [mysqld] ..... log = "E:/mysql_log.log" #设置日志文件,记录sql语句执行 或 general-log=1 general_log_file=E:/mysql_log.log
#需要重启Mysql服务 net stop/start mysql
|