Django 表关系

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中定义,定义后所有查询方法对自动过滤掉逻辑删除的数据
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值