博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django框架----ORM数据库操作注意事项
阅读量:7205 次
发布时间:2019-06-29

本文共 2541 字,大约阅读时间需要 8 分钟。

1、多对多的正向查询

class Class(models.Model):    name = models.CharField(max_length=32,verbose_name="班级名")    course = models.CharField(verbose_name="课程",max_length=32)    def __str__(self):        return self.nameclass Teacher(models.Model):    name = models.CharField(max_length=23,verbose_name="姓名")    classes = models.ManyToManyField(verbose_name="所属班级",to="Class")    def __str__(self):       return self.name

题目1:查找娜娜老师所带的班级

# 方式一:基于对象的查找        obj = models.Teacher.objects.filter(name="娜娜").first()        print(obj.classes.all())        print("娜娜老师带的班级",obj.classes.values("name"))        # 方式二:基于双下划线的查找        obj_cls = models.Teacher.objects.filter(name="娜娜").values("classes__name")        print("娜娜老师带的班级",obj_cls)

注意:要说明的是多对多的查询用.all,,查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此。我就是犯了这样的错,引以为戒。。

总结:不管是一对多,还是多对多,要是查询多得一方就得用all()

运行结果截图:

2、多对多的反向查询

1.表结构:

from django.db import models# Create your models here.# 一个学生有一个班级,一个班级可以有好多学生,所以是# 一对多的关系,关联字段放在多的一方class Student(models.Model):    name = models.CharField(max_length=32,verbose_name="姓名")    age = models.IntegerField(verbose_name="年龄")    classes = models.ForeignKey(to="Class",verbose_name="所属班级")    def __str__(self):        return self.nameclass Class(models.Model):    name = models.CharField(max_length=32,verbose_name="班级名")    course = models.CharField(verbose_name="课程",max_length=32)    def __str__(self):        return self.nameclass Teacher(models.Model):    name = models.CharField(max_length=23,verbose_name="姓名")    classes = models.ManyToManyField(verbose_name="所属班级",to="Class")    def __str__(self):        return self.name

2、查询海燕在那个班级

  # 方式一:    print("海燕所在的班级",models.Student.objects.filter(name="海燕").values("classes__name"))    # 方式二:    obj_cls = models.Student.objects.filter(name="海燕").first()    print("海燕所在的班级",obj_cls.classes.name)

3、查询海燕所在班的老师的姓名

print("海燕所在班的老师的姓名",models.Student.objects.filter(name="海燕").values("classes__teacher__name"))

4、查询软件测试151班的所有学生的姓名

print("软件测试151班的所有学生的姓名",models.Class.objects.filter(name="软件测试151").values("student__name")) obj = models.Class.objects.filter(name="软件测试151").first() # print("软件测试151班的所有学生的姓名",obj.student_set.name)  #这样打印的结果是None print("软件测试151班的所有学生的姓名",obj.student_set.all().values("name"))

二、需要掌握的一个很重要的知识点

1、form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响

  <button class="login" type="button">注册</button>

上面两种写法是对的,功能一样。如果写成这种,默认为submit,本来doValidation方法里有提交功能了,再加上按钮也是提交功能,会提交两次。所以使用按钮时最好指定type类型。

 

转载于:https://www.cnblogs.com/TheLand/p/8659171.html

你可能感兴趣的文章
PHP5.5安装PHPRedis扩展
查看>>
c#Socket Tcp服务端编程
查看>>
java构造函数注意点
查看>>
Asp.net 中配置 CKEditor和CKFinder
查看>>
Use dynamic type in Entity Framework 4.1 SqlQuery() method
查看>>
《Python CookBook2》 第四章 Python技巧 - 若列表中某元素存在则返回之 && 在无须共享引用的条件下创建列表的列表...
查看>>
redhat网卡设置
查看>>
javascript 的作用域
查看>>
JFinal极速开发框架使用笔记(二) 两个问题,一个发现
查看>>
AutoCompleteTextView
查看>>
SecureCRT生成序列
查看>>
Android 应用程序主框架搭建
查看>>
2012腾讯春季实习生面试经历(二)
查看>>
用Bootstrap框架弹出iframe页面 在弹出的模态框中载人iframe页面,bootstrapiframe
查看>>
2012腾讯暑期实习面经(技术类web前端)
查看>>
第3种方法获取redis cluster主从关系
查看>>
注册表管理(本地、远程)
查看>>
《Linux内核设计与实现》第四周读书笔记——第五章
查看>>
关于COM组件log的位置
查看>>
C++操作符重载
查看>>