1、关联关系
1、一对一
2、一对多
3、多对多
2、一对一关系
场景:人(1个)---身份证(1个) 1:1
外键关联格式:
关联的属性 = models.OneToOneField(关联表的类名)
django会自动的去外键关联
1、设计模型
1、人 Person
name 姓名
age 年龄
2、身份证 IDCard
idNumber 身份证号
address 地址
sex 性别
person---外键---OneToOneField 一对一
例:i_person = models.OneToOneField(Person)
2、插入数据
1、人
def savePerson(request):
person = Person()
person.p_name = "麻花4"
person.p_age = 27
person.save()
return HttpResponse('插入成功')
2、身份证
def saveIDCard(request):
idcard = IDCard()
idcard.i_address = '湖南'
idcard.i_idnumber = 1111
# 先找到需要绑定的人
person = Person.objects.filter(p_name='麻花').first()
# 外键---绑定对象
idcard.i_person = person
idcard.save()
return HttpResponse('插入身份证')
3、删除
def delPerson(request):
person = Person.objects.filter(p_name='麻花').first()
person.delete()
return HttpResponse('删除成功')
1、如果删除的是主表中的数据,如果在从表中没有对应的数据,会直接删除该数据;
如果在从表中存在对应的数据,会连同从表中的数据一同删除。
2、如果删除的是从表中的数据,会直接删除该数据,主表中的数据不会受影响。
4、表的关系(主—从)
主表(被动链接的一方) --- 从表(主动链接的一方)
5、设置外键关联的数据的保护模式
如:i_person = models.OneToOneField(Person,on_delete = models.PROTECT)
models.CASCADE 默认模式
如果删除的是主表中的数据,如果在从表中存在对应的数据,会连同从表中的数据一同删除。
models.PROTECT 保护模式
当删除主表的数据的时候,如果有对应的从表数据,则不能删除,程序报错,如果没有对应的从表数据,则正常删除。
models.SET_DEFAULT 设置为默认值
当删除主表的数据,如果对应的从表有数据,则主表数据直接删除,从表对应的外键自动设置为默认值。
models.SET_NULL 设为空值
当删除主表数据的数据,如果有对应的从表数据,则主表数据直接删除,从表对应的外键自动设置为空值。
models.SET(value) 设为指定的值
当删除主表的数据时,如果有对应的从表数据,则主表数据直接删除,从表对应的外键自动设置为指定的值。
3、一对多
场景:人(1个)---爱好(多个) 1:N
外键关联格式:
关联的属性 = models.ForeignKey(关联表的类名)
1、设计表
1、人 Person
name 姓名
age 年龄
2、爱好 hobby
name 爱好名
price 爱好的花费
外键:
person = models.ForeginKey(类名)
2、添加数据
1、人
def savePerson(request):
person = Person()
person.p_name = "麻花4"
person.p_age = 27
person.save()
return HttpResponse('插入成功')
2、爱好
def saveHobby(request):
hobby = Hobby()
hobby.h_name = '小电影'
hobby.h_price = 0
person = Person.objects.filter(p_name = '麻花4').first()
hobby.h_person = person
hobby.save()
return HttpResponse('插入成功')
** 可以给一个人绑定多个爱好
3、修改数据+外键关联数据的保护模式
与上面所写一对一一样
4、多对多
场景:
用户(1个) ----- 商品(多个)
商品(1个) ------用户(多个)
用户(多个) -----商品(多个)
外键关联格式:
关联的属性 = models.ManyToManyField(关联表的类名)
1、设计模型
1、buyer 用户
name 名字
age 年龄
2、goods 商品
name 商品名
price 商品价格
例:g_buyer = models.ManyToManyField(Buyer)
将相对不重要的表设置外键关联
3、第三张表用来维护两张表的关系
django可以自动生成
外键关联用户id
外键关联商品id
2、添加数据
def saveBuyerGoods(request):
# 获得购买者
buyer = Buyer.objects.filter(pk=1).first()
buyer2 = Buyer.objects.filter(pk=2).first()
buyer3 = Buyer.objects.filter(pk=3).first()
# 获得商品
goods = Goods.objects.filter(pk=1).first()
# 添加数据,一对多的关系时,用add表示添加,且可以添加多个
goods.g_buyer.add(buyer)
goods.g_buyer.add(buyer2)
goods.g_buyer.add(buyer3)
goods.save()
return HttpResponse('插入订单成功')
3、删除数据
1.主表(购买者)
2.主表(商品)
3.(从表)自动生成的表
如果删除的是主表中的数据,如果从表中没有关联的数据,直接删除 ;如果从表中有关联的数据,会连同从表中的关联数据(多条)一同删除。
4、查询
1、一对一
1、自己查询自己,直接查找到对应的对象即可
2、根据从表中的信息查询主表信息
从表中有一个外键关联的字段,该字段与模型中的属性对应,我们可以直接通过该外键属性,获取到关联的数据对象
如:person = idcard.i_person
3、根据主表信息查询从表信息
django在创建主表与从表关系时,会自动为主表对应的模型创建一个隐式属性,该隐式属性就是对应的从表数据对象。
格式:主表模型对象.从表模型名的全小写 即可获得从表数据
如:idcard = person.idcard
2、一对多
1、根据从表中的信息查询主表中的信息
可以直接根据外键属性获取对象
2、根据主表中的信息查询从表中的信息
格式:主表模型对象.从表模型名的全小写_set.查询方法
即可以直接获得从表中对应的多条数据
如:hobbys = person.hobby_set.all()
3、多对多
1、根据从表中的信息查询主表中(多条)信息
格式:从表模型对象.外键属性.查询方法
如:buyers = goods.g_buyer.all()
2、根据主表中的信息查询从表中(多条)信息
格式:主表模型对象.从表模型名的全小写_set.查询方法
如:goodses = buyer.goods_set.all()
5、django中的隐式属性,显示属性
1、显示属性
开发人员直接定义的属性就是显示属性
2、隐式属性
在django中,django为了便于发开提供了很多隐式属性(django自带的),这些隐式属性有很大的功能,如:查询、创建...
6、自定义的manager
需求1:方便的创建测试数据
1、自定义manager的使用
1、在models中定义一个类(myManager)继承Manager
from django.db.models_import Manager
2、在类中可以定义自己的方法
如:方便的创建测试数据
def createTestStudnet(self,name,age):
student = Student()
student.s_name = name
student.s_age = age
# .....
student.save()
3、在对应的迷行类中添加一个属性,该属性为自定义manager对象
如:mymanager = myManager()
注意:Manager对象就是我们平时常用的objects对象,如果自己定义manager对象,那么objects对象不能使用,应使用自己定义的manager对象
如: Student.mymanager.createTestStudnet("玛花",34)
格式:类名.自己定义的manager对象名.方法()
需求2:过滤掉已经被逻辑删除的数据
def get_queryset(self):
return super(MyStudentManager, self).get_queryset().exclude(s_isdelete=True)
以上方法需要在myManager中定义,定义后所有查询方法对自动过滤掉逻辑删除的数据