ORM多表操作

Posted chouchoudedahuilang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ORM多表操作相关的知识,希望对你有一定的参考价值。

from django.db import models

class Classes(models.Model):
    """
    班级表,男
    """
    titile = models.CharField(max_length=32)
    m = models.ManyToManyField(Teachers,related_name=sssss)

class Teachers(models.Model):
    """
    老师表,女
    """
    name = models.CharField (max_length=32)

class Student(models.Model):
    """
    学生表
    """
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    gender = models.BooleanField()
    cs = models.ForeignKey(Classes,related_name=ssss) # cs,cs_id  1    3班



######################## 单表 ########################
# 增加
# Teachers.objects.create(name=‘root‘)
#或者:
# obj = Teachers(name=‘root‘)
# obj.save()
#
# Teachers.objects.all()
# Teachers.objects.filter(id=1)
# Teachers.objects.filter(id=1,name=‘root‘)
# result = Teachers.objects.filter(id__gt=1)
# [obj(id,name),]
# result = Teachers.objects.filter(id__gt=1).first()
# 删除
# Teachers.objects.filter(id=1).delete()
#
# Teachers.objects.all().update(name=‘alex‘)
# Teachers.objects.filter(id=1).update(name=‘alex‘)

######################## 一对多 ########################
"""
班级:
id    name
 1    3班
 2    6班

学生
id   username    age    gender   cs_id
1      成成       18     男        1
2      小芳       22     女        2
3      王杰       25     男        1
"""
# 增加
# Student.objects.create(username=‘成成‘,age=18,gender=‘男‘,cs_id=1)
# Student.objects.create(username=‘小芳‘,age=18,gender=‘女‘,cs= Classes.objects.filter(id=1).first() )
# 查看
"""
ret = Student.objects.all()
# []
# [ obj(..),]
# [ obj(1      成成       18     男        1),obj(2      小芳       22     女        2),obj(3      王杰       25     男        1),]
for item in ret:
    print(item.id)
    print(item.username)
    print(item.age)
    print(item.gender)
    print(item.cs_id)
    print(item.cs.id)
    print(item.cs.name)
"""
# 删除
# Student.objects.filter(id=1).delete()
# Student.objects.filter(cs_id=1).delete()

# cid = input(‘请输入班级ID‘)
# Student.objects.filter(cs_id=cid).delete()

# cname = input(‘请输入班级名称‘)
# Student.objects.filter(cs_id=cid).delete()
# Student.objects.filter(cs__name=cname).delete()  ##如果写filter跨表的时候不能用. 只能用__




######################## 多对多 ########################

# 多对多
"""
班级:
id  title
1    3班
2    4班
3    5班
老师:
id   title
 1    王老师
 2    陈老师
 3    李老师
 4    赵老师
 老师班级关系表(类):
id   班级id   老师id
 1     1        2
 2     1        3
 #3     1        4
 4     2        2
 5     2        3
 6     2        4
 7     1        5

# 增
obj = Classes.objects.filter(id=1).first() #1    3班
obj.m.add(2)  ##老师id=2
obj.m.add([4,3])

# obj = Classes.objects.filter(id=2).first() #1    3班
# obj.m.add(2)
# obj.m.add([4,3])

obj = Classes.objects.filter(id=1).first() #1    3班
# 删除
# obj.m.remove([4,3])
# 清空
obj.m.clear()
# 重置
obj.m.set([2,3,5])  ##不存在的新建

# 查第三张表
# 把3班的所有老师列举
obj = Classes.objects.filter(id=1).frist()
obj.id
obj.titile
ret = obj.m.all() # 第三张表
# ret是一个 [ 老师1(id,name),obj(id,name)   ]

"""
from django.shortcuts import render
from django.shortcuts import HttpResponse
from app01 import models

def test(request):
    # models.Classes.objects.create(titile=‘2班‘)
    # models.Classes.objects.create(titile=‘3班‘)
    # models.Classes.objects.create(titile=‘4班‘)
    #
    # models.Student.objects.create(username=‘王成‘,age=24,gender=True,cs_id=1)
    # models.Student.objects.create(username=‘王杰‘, age=22, gender=True, cs_id=1)
    # models.Student.objects.create(username=‘王忠‘,age=18,gender=True,cs_id=1)
    # models.Student.objects.create(username=‘王浩‘,age=33,gender=True,cs_id=2)

    # ret = models.Student.objects.filter(cs__titile=‘2班‘)
    # print(ret)

    # obj = models.Classes.objects.filter(titile=‘2班‘).first()
    # print(obj.id)
    # print(obj.titile)
    ####反向查找  反向:小写类名_set(默认) ==> related_name=‘ssss‘
    ##print(obj.student_set.all())
    # print(obj.ssss.all())

    # ret = models.Classes.objects.all().values(‘id‘, ‘titile‘,‘ssss‘,"ssss__username")
    # print(ret)
    # # 注意谁是主表
    # models.Student.objects.all().values(‘username‘, ‘cs__titile‘)  ##学生为主表
    # models.Classes.objects.all().values(‘titile‘, ‘ssss__username‘)  ##班级为主表


    # #################### 多对多 ####################
    # models.Teachers.objects.create(name=‘王老师‘)
    # models.Teachers.objects.create(name=‘陈老师‘)
    # models.Teachers.objects.create(name=‘李老师‘)
    # models.Teachers.objects.create(name=‘赵老师‘)

    # cls_list = models.Classes.objects.all()  ##找出所有班级obj.id obj.title obj.m.all()
    # for obj in cls_list:
    #     print(obj.id,obj.titile)
    #     for row in obj.m.all():
    #         print(‘----‘,row.name)

    # obj = models.Classes.objects.filter(id=1).first()
    # obj.m.add(3)  ##给id=1的班级新增一个老师

    # obj = models.Teachers.objects.filter(id=2).first()
    # obj.sssss.set([1,2]) ##给id=2的老师重置id=1,2的班级
    # obj.sssss.remove(3) ##删除


    # v = models.Classes.objects.all().values(‘id‘,‘titile‘,‘m‘,‘m__name‘)
    # print(v)
    # v = models.Classes.objects.all().values(‘id‘,‘titile‘,‘m‘,‘m__name‘) ##字典
    
    # print(v)
    # for item in v:
    #     print(item[‘m‘],type(item[‘m‘]))

    # v = models.Teachers.objects.all().values(‘name‘,‘sssss__titile‘)
    # print(v)
    return HttpResponse(...)

 

以上是关于ORM多表操作的主要内容,如果未能解决你的问题,请参考以下文章

ORM多表操作

ORM 多表操作

ORM 多表操作

ORM------多表操作

Django框架之ORM多表关联操作

17-2 orm单表操作和多表操作