您现在的位置是:网站首页>>Python>>Django

django 实现连表查询

发布时间:2018-11-01 16:08:14作者:wangjian浏览量:1281点赞量:2

    一:首先创建model模型

    1:班级表

    2:学生表 (学生与班级的关系是多对一)

    3:学生信息表 (学生信息表与学生表是一对一)

    4:学习用具表 (学习用具表与学生表示多对多)

    models.py如下:

    from django.db import models
    # 学生表
    class Student(models.Model):
        name = models.CharField('学生姓名',max_length=100,default='')
        classes = models.ForeignKey('Classes',models.DO_NOTHING) #这里关联的是classes表(多对一),使用django生成数据库时生成的字段为classes_id,由于student表在classes表的商贩所以第一个参数必须加上单引号
        class Meta:
            db_table = 'student'   #设置表名
    # 学生信息表
    class StudentDetail(models.Model):
        student = models.OneToOneField(Student,models.DO_NOTHING)  #这里就是关联用户表的字段(一对一),使用django生成数据库时生成的字段为user_id
        age = models.IntegerField('年龄',default=0)
        height = models.CharField('身高',max_length=10,default='')
        sex = models.IntegerField('性别(0:男 1:女)',default=0)
        class Meta:
            db_table = 'student_detail'   #设置表名
    # 班级表
    class  Classes(models.Model):
        name = models.CharField('班级名称',max_length=10,default='')
        class Meta:
            db_table = 'classes'
    # 学生用具表
    class LearningTool(models.Model):
        tool_name = models.CharField('用具名称',max_length=10,default='')
        student = models.ManyToManyField(Student)  #这里关联的是student表的字段(多对多),使用django生成数据库时会生成一张中间表learning_tool_student,字段为learningtool_id,student_id
        class Meta:
            db_table = 'learning_tool'

    模型之间的三种关系:

    一对一(OneToOneField),一对多(ForeignKey)和多对多(ManyToManyField)

    模型的常用字段类型

    BooleanField: 布尔类型字段

    CharField: 字符串类型字段

    DateField: 日期字段

    DateTimeField:日期时间字段

    DecimalField:(精确)小数字段

    EmailField:Email字段

    FileField:文件字段

    FloatField:(浮点数)小数字段

    ImageField:图片字段

    IntegerField:整数字段

    IPAddressField:IP字段

    SmallIntegerField:小整数字段

    TextField:文本字段


    使用django命令生成数据库

    python manage.py makemigrations
    python manage.py migrate

    生成数据库如下:

    image.png


    查询实例

    def index(request):
        # 一对一
        student = StudentDetail.objects.values('age','sex','student__name')  #查询学生的学生信息
        student = StudentDetail.objects.get(id = 1).student  #获取指定学生信息的学生对象集
        student = StudentDetail.objects.get(id = 1).student.name  #获取指定学生信息的学生名称
        student = StudentDetail.objects.get(student__id = 1)  #获取指定学生的学生信息对象集
        student = StudentDetail.objects.get(student__id = 1).age #获取指定学生的指定信息(height,sex,id,student_id)
        student = StudentDetail.objects.get(student__id = 1).student #获取指定学生的对象集
        student = StudentDetail.objects.get(student__id = 1).student.name #获取指定学生的姓名与Student.objects.get(id = 1)相同
        # Student.objects.get(id = 1).student_detail_set.all()
        # 一对多
        student = Student.objects.get(id = 1).classes  #查询指定学生的班级对象集
        student = Student.objects.get(id = 1).classes.name  #查询指定学生的班级名称
        # 查询指定班级的学生名称和班级名称
        # 正向查询
        student = Student.objects.filter(classes__id = 1).values('name','classes__name')
        # 反向查询
        student = Classes.objects.get(id = 1).student_set.values('name','classes__name')
        student = Classes.objects.filter(id=1).values('name', 'student__name')  # 查询指定班级的学生名称及班级名称
        #多对多
        #正向查询
        student = LearningTool.objects.filter(id = 1).values('tool_name','student__name')   #查询指定学习用具对应的学生名称和用具名称
        student = LearningTool.objects.get(id = 1).student.values('name')  #查询指定学习用具对应的学生名称
        #
        # # 反向查询
        #
        student = Student.objects.get(id =1).learningtool_set.all()  #指定学生的学习用具
        student = Student.objects.filter(id =1).values('name','learningtool__tool_name')  #查询指定学生的用具信息及学生信息


    多对多添加:

    正向添加

    stu = Student.objects.get(id =1)
    lea = LearningTool.objects.get(id = 2)
    lea.student.add(stu)   #可以直接添加obj
    lea.student.add(3)    #可以直接添加id
    stu_list=Student.objects.all()
    lea.student.add(*stu_list) #可以直接添加obj列表
    lea.student.add(*[1,2,3]) #可以直接添加id列表

    反向添加

    stu = Student.objects.get(id =2)
    lea = LearningTool.objects.get(id = 1)
    stu.learningtool_set.add(lea)
    stu.learningtool_set.add(3)
    stu.learningtool_set(*LearningTool.objects.all())
    stu.learningtool_set(*[1,2,3,4])

    多对多删除

    正向删除

    #删除id为1的学习用具的所有学生
    lea = LearningTool.objects.get(id = 1)
    lea.student.clear()
    #删除id为2的学习用具的学生,学生id为1,2,3
    lea=LearningTool.objects.get(id=2)
    lea.student.remove(1)
    lea.student.remove(*[2,3])

    反向删除

    # 删除学生id=1的所有学习用具
    stu=Student.objects.get(id=1)
    stu.learningtool_set.clear()



2 +1